O Ubuntu não está enviando o SIGTERM ao desligamento

18

Estou começando a suspeitar que o Ubuntu não está dizendo aos aplicativos em execução que está sendo encerrado para permitir que eles saiam corretamente, mas, ao invés disso, obriga-os a sair.

Se eu deixar o chrome aberto ao desligar, ele diz que ele não fechou corretamente na última vez que abri-lo novamente após a inicialização, o LibreOffice não me pergunta se eu quero salvar meu documento e estou fazendo um aplicativo que precisa executar algum código na saída, mas não é permitido fazer isso quando o computador é desligado.

Como eu entendi, o SIGTERM é primeiro enviado para todos os processos para permitir que eles saiam de forma limpa e, se não saírem, o SIGKILL é enviado para forçá-los a sair. Parece que o Ubuntu não está enviando SIGTERM ou não dá tempo suficiente aos aplicativos antes de enviar o SIGKILL.

Existe alguma maneira de corrigir isso?

Estou executando o Ubuntu 16.04, mas o problema também existia em 15.10. Não sei dizer se estava lá desde que comecei a usar o Ubuntu quando o 15.10 era a versão mais recente.

Editar: eu uso o Unity e desligo o meu computador pressionando a engrenagem no canto superior direito e selecionando desligar, embora o problema seja o mesmo se você estiver executando sudo halt no terminal.

Edit: estou observando o mesmo comportamento quando apenas sair. Meu palpite é que o sinal deve ser enviado no logout e, portanto, o problema surge no desligamento e logout.

    
por GKraft 13.06.2016 / 11:39

3 respostas

1

Infelizmente, não funciona assim. Muitos desses programas que realmente possuem um manipulador de sinal, não bloqueiam o sinal para mostrar uma caixa de diálogo de confirmação. O manuseio de sinal é geralmente mínimo ou ausente.

Você pode facilmente experimentá-lo sem ter que desligar. Basta enviar o SIGTERM para o seu processo Firefox ou LibreOffice:

$ pkill firefox

Normalmente, o Firefox pode perguntar se você realmente deseja fechá-lo. Além disso, normalmente demora um pouco para fechar, especialmente quando ele está sendo executado há muito tempo e usando mais de 1 GB de RAM - geralmente leva um minuto para o processo terminar após a última janela ter sido fechada. Nada disso acontece quando você envia SIGTERM, o processo é terminado instantaneamente.

No entanto, alguns ambientes de área de trabalho fecham todas as janelas abertas antes de serem encerradas. Ao contrário do SIGTERM, fechar uma janela programaticamente é como clicar no botão X dessa janela, ou Alt + F4 . Este também é o que o script na outra resposta faz - ele usa wmctrl para fechar todas as janelas abertas graciosamente.

Quando uma janela é fechada, o programa não está com pressa e pode fechar tudo dentro dessa janela, por exemplo, abas abertas e também pode mostrar uma janela de diálogo se houver trabalho não salvo. Depois que todas as janelas abertas de um aplicativo tiverem sido fechadas, o processo geralmente terminará logo depois disso.

Portanto, depende do seu ambiente de área de trabalho (supondo que você use o ambiente de área de trabalho para desligar e não sudo poweroff ). Por exemplo, o KDE deve esperar que as janelas abertas sejam fechadas antes de serem encerradas, enquanto o MATE não.

Linha inferior: feche todas as janelas abertas manualmente antes de desligar. Ou use um ambiente de área de trabalho que aguarde a conclusão de todas as janelas.

    
por c0xc 02.08.2016 / 14:04
0

Por que vale a pena, há algum tempo, encontrei este procedimento no fórum do Manjaro:

close_apps () {
WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
for i in $WIN_IDs; do wmctrl -ic "$i"; done

# Keep checking and waiting until all windows are closed
while [ "$WIN_IDs" != "" ]; do
        sleep 0.1;
        WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
done

}

Você pode chamá-lo em um script para fechar todos os aplicativos abertos antes do desligamento (ou reiniciar).

O único problema é que ele foi criado para o Xfce, portanto, ele precisa de mudanças que o Unity DE impõe. Uma pequena ajuda de alguém mais experiente viria bem aqui para ajudar a resolver o problema do OP.

    
por S.R. 28.06.2016 / 04:19
0

Na verdade, uma parte do script que fecha todas as janelas e não depende de nenhum DE específico está disponível no Ask. 2-nd e 3-respostas são particularmente úteis. Com apenas algumas linhas a mais, e criando um lançador no painel ou na área de trabalho, você pode obter o desligamento normal que funciona na DE que você está usando.

Como fechar todas as janelas abertas graciosamente

    
por S.R. 12.08.2016 / 20:07

Tags