Desligamento gracioso no ArchLinux

21

Estou tentando obter um desligamento / reinicialização normal do ArchLinux com o GNOME Shell. Agora, quando eu peço o desligamento, ele é imediatamente desligado sem dar tempo aos programas abertos para fechar / salvar arquivos abertos normalmente. Como resultado, sempre que eu reinicio o Chrome (por exemplo), ele diz que a sessão não foi fechada corretamente etc. Ao ler na Web, aprendi que o sistema estava desligando os processos, ele primeiro enviou um SIGTERMseguido por SIGKILLse o processo não fosse fechado dentro de um determinado tempo limite. No entanto, percebo que no meu sistema SIGKILLé enviado imediatamente depois SIGTERMe acho que essa é a causa de um encerramento não normal dos programas.

Encontrei alguma documentação que (se a ler corretamente) indica que o tempo limite antes do envio SIGKILLpode ser definido por TimeoutStopSec=opção. Também o envio SIGKILLtambém pode ser desativado por SendSIGKILL=opção. Mas não consigo encontrar onde configurar essas opções ... existe um arquivo de configurações de desligamento / reinicialização do systemd onde eu possa definir essas opções?

EDITAR:

Fiz alguns testes e descobri duas coisas interessantes:

  1. Se eu fechar manualmente o chrome assim killall -SIGTERM chrome, ele não reclamará que não foi fechado corretamente na próxima vez em que o reiniciar. Se eu fechar assim killall -SIGKILL chrome, ele reclamará. Isso me diz que o chrome está manipulando o SIGTERM corretamente.
  2. Observando a saída do meu procedimento de desligamento, o systemd imprime Sending SIGTERM...imediatamente seguido porSending SIGKILL...

De acordo com o comentário abaixo, o systemd está lidando apenas com seus processos. Então, no meu caso, GDM. Isso me diz que o problema poderia ser:

  1. o GDM não está fechando seus processos filhos (por exemplo, Chrome) corretamente (por exemplo, enviando o SIGTERM para eles)
  2. ou o systemd está enviando uma mensagem SIGKILL para o GDM com antecedência, não dando tempo para fechar corretamente seus filhos.

Existe uma maneira de verificar / configurar como o GDM realmente fecha seus filhos?

lviggiani
fonte
1
O Systemd apenas sinaliza processos diretamente sob seu controle. Coisas como o cromo não são um desses processos. O Systemd sinalizará ao seu gerente de exibição (xdm, gdm, kdm, qualquer que seja); então, cabe ao gerente da exibição sinalizar para seus filhos, e assim por diante até chegar ao chrome. Se nada sinaliza o cromo, ele morre quando o servidor xorg é desligado e o visor desaparece.
Patrick
@ Patrick: obrigado, eu acho que sim. É por isso que tentei adicionar 'TimeoutStopSec = 90s' à seção '[Service]' de '/etc/systemd/system/display-manager.service' de acordo com isso: freedesktop.org/software/systemd/man/systemd.service. html, mas nada muda ... :(
lviggiani
O Chrome deve estar sob systemd'scontrole - systemdé pid 1- mas os executivos do Chrome saem de seu script de wrapper em uma subcamação e invocam os processos filhos posteriormente. Ainda assim, ele fará o que for necessário zygotes, desde que seu sistema esteja configurado corretamente. Você está usando uma dessas soluções de espaço temporário para o Chrome que você encontrará recomendadas no wiki do Arch?
precisa saber é o seguinte
1
Eu me deparei com um problema semelhante com o KDE e o Firefox no Arch. Eu nunca tentei descobrir o porquê.
Strongbad
2
O GDM não está sinalizando processos. O GDM é essencialmente uma maneira idiota de conectar o Xorg e o PAM. o verdadeiro culpado é gnome-session.
strugee

Respostas:

2

Para desligar normalmente a área de trabalho, você pode precisar aumentar o TimeoutStopSec=GDM ou qualquer outro gerenciador de exibição que esteja usando.

CameronNemo
fonte
Parece-me que o GDM nunca deveria ter dito ao systemd para desligar, se não soubesse se todos os clientes poderiam ser fechados.
EnigmaticPhysicist
2

Isso funcionou para mim no meu Arch Linux com Gnome 3.12. Acontece que talvez isso esteja relacionado à configuração /etc/gdm/PostSession/Default.

  1. Execute sudo pacman -S wmctrlpara instalar o wmctrl para gerenciamento do Windows.

  2. Crie um arquivo executável para fechar todas as janelas. Por exemplo, eu o incluo /home/[your_username]/bin/close-all-windowscom este conteúdo:

    #!/bin/sh
    wmctrl -l | while read -r line
    do
        wmctrl -c `echo "$line" | sed 's/.*  [0-9]* [your_hostname] //'`
    done
    
  3. Modifique /etc/gdm/PostSession/Defaulte adicione este conteúdo antes exit 0:

    echo " Closing selected windows programs gracefully"
    export DISPLAY=:0
    su [your_username] -c /home/[your_username]/bin/close-all-windows
    

Espero que eles funcionem.

sorpaas
fonte
Para Plasma 5, colocar esse script em config / plasma-workspace / shutdown / resolve o problema
AF7
-1

O script wmctrl do sorpass funciona bem para mim (no CentOS 7 eu apenas tive que executar o 'yum install wmctrl' primeiro). No entanto, descobri que o / etc / gdm / PostSession / Default parecia funcionar apenas no logout, não no desligamento. Portanto, em vez de usar / etc / gdm / PostSession / Default, agora chamo o script wmctrl do sorpass a partir do script python de Seamus Phelan, que pode ser encontrado nesses dois sites:

Essa combinação de scripts funciona muito bem para fechar o Firefox, Chrome etc. automaticamente e de forma limpa quando eu saio ou desligo minha máquina de desktop CentOS 7. Observe que no CentOS 7 você deve executar 'yum install gnome-python2-gnome' para que este script python funcione.

Jim
fonte