Ubuntu não está enviando SIGTERM no desligamento

21

Estou começando a suspeitar que o Ubuntu não está dizendo aos aplicativos em execução que está sendo desligado para deixá-los sair corretamente, mas obriga-os a sair.

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

Pelo que entendi, o SIGTERM é enviado primeiro a todos os processos para permitir que eles saiam corretamente e, se eles não saem, o SIGKILL é enviado para forçá-los a sair. Parece que o Ubuntu não está enviando o SIGTERM de forma alguma ou não oferece tempo suficiente aos aplicativos antes de enviar o SIGKILL.

Existe alguma maneira de corrigir isso?

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

Editar: eu uso o Unity e desligo o computador pressionando a engrenagem no canto superior direito e selecionando desligar, embora o problema seja o mesmo se estiver sendo executado sudo haltno terminal.

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

GKraft
fonte
Como você está se desligando?
terdon
1
Cromo e LibreOffice não estão lidando com SIGTERM a forma como você gostaria que ser tratado
Andrea Corbellini
2
Não sei ao certo o que você quer dizer. Você quer dizer que eles não estão lidando corretamente com o SIGTERM? Talvez não, mas como escrevi na minha pergunta, estou trabalhando em um programa que lida com o SIGTERM, mas esse código nunca parece ser executado. SIGINT enquanto pressiona ctrl + C funciona perfeitamente. Eu ainda acredito que há algum problema em relação ao Ubuntu notificando os processos em execução ao desligar.
GKraft13 /
1
Talvez relacionado a este bug: # 1448259 O Systemd não envia o SIGTERM primeiro no desligamento ?
JonasCz - Restabelece Monica
2
É chato ter que fechar todos os aplicativos manualmente, e se você esquecer um minimizado? Não vai salvar o seu trabalho. E existem muitos processos em segundo plano que você não pode controlar com facilidade ou não pensa. Eles não terão a chance de se limpar ou salvar o que estavam fazendo.
GKraft

Respostas:

3

Infelizmente, não funciona dessa maneira. Muitos desses programas que realmente têm 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 experimentá-lo facilmente sem precisar desligar. Basta enviar o SIGTERM para o processo em execução no Firefox ou LibreOffice:

$ pkill firefox

Normalmente, o Firefox pode perguntar se você realmente deseja fechá-lo. Além disso, geralmente leva um tempo para fechar, especialmente quando ele está em execução há muito tempo e usa mais de 1 GB de RAM - geralmente leva um minuto para o processo terminar após a última janela ser fechada. Nada disso acontece quando você envia o SIGTERM, o processo é finalizado instantaneamente.

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

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 são fechadas, o processo geralmente termina logo depois.

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

Conclusão: Feche todas as janelas abertas manualmente antes de desligar. Ou use um ambiente de área de trabalho que aguarde o fechamento de todas as janelas.

c0xc
fonte
Eu vejo o processo de desligamento e a manipulação de sinal não funcionou exatamente como eu pensava. Agora eu entendo como ele deve funcionar e por que não funcionou como eu esperava.
GKraft 12/08
0

Pelo 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 próprio para fechar todos os aplicativos abertos antes do desligamento (ou reinicialização).

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

SR
fonte
Não terei acesso ao meu computador por alguns dias; portanto, não posso experimentá-lo, mesmo que esteja corrigido. Seria realmente necessário usar esse script? Eu acho que o ubuntu deve lidar com isso sozinho.
GKraft
Acordado. Mas funciona perfeitamente no Xubuntu. Por exemplo, o desligamento aguardará indefinidamente se houver um documento não salvo.
SR
0

Na verdade, uma parte do script que fecha todas as janelas e não depende de nenhuma DE específica está disponível no Ask. As respostas 2ª e 3ª são particularmente úteis. Com apenas algumas linhas a mais, e criando um iniciador no painel ou na área de trabalho, você pode obter o desligamento completo que funciona no DE que você está usando.

Como fechar todas as janelas abertas normalmente

SR
fonte
Eles parecem promissores. Provavelmente, acabarei usando um script semelhante.
GKraft 12/08