Isso depende do sistema init e de como está configurado. Mas qualquer configuração sensata permite que o software do sistema registre um gancho para ser executado no desligamento. Com um init tradicional do System V, esse é um arquivo em /etc/rc0.d
. Com um init BSD tradicional, esse código está em /etc/rc.shutdown
. Com Upstart, esse é um evento de mudança de nível para 0 ou 6. A lista continua, e é por isso que manter pacotes para todas as distribuições pode ser muito trabalhoso (a maioria dos autores forneceria um script de desligamento para seu aplicativo e deixaria um O mantenedor da distribuição faz um pacote que registra o script de desligamento no lugar certo).
Depois que todos os scripts específicos do aplicativo são executados, as fases finais do desligamento ocorrem. Normalmente, isso envolve desmontar todos os sistemas de arquivos, exceto aqueles onde ainda existem arquivos abertos, depois matar todos os processos restantes e, finalmente, desmontar os sistemas de arquivos restantes (exceto a raiz que é remontada somente leitura) e parar ou reinicializar o computador. É comum enviar a todos os processos um sinal TERM, que pode ser acessado, e alguns segundos depois enviar um sinal KILL. Enquanto um processo pode tentar reagir, o tempo é limitado e o sistema não espera.
Portanto, se o seu aplicativo estiver instalado como root, basta registrar um script de inicialização no momento do desligamento. Se o seu aplicativo é instalado por usuários sem privilégios, você não pode ter a garantia de que poderá fazer qualquer coisa durante a fase de desligamento.
Observe que você precisa lidar com uma falha do sistema ou falha de energia de qualquer maneira. As ações de tempo de desligamento devem ser limitadas a coisas que tornam a próxima inicialização mais eficiente, não deve haver nada que precise ser feito.