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 halt
no 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.
Respostas:
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:
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.
fonte
Pelo que vale a pena, há algum tempo, encontrei este procedimento no fórum do Manjaro:
}
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.
fonte
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
fonte