Percebi que com o Fedora 17, uma operação de desligamento (por exemplo, shutdown -h now) ficou muito mais rápida (parece 2 segundos no máximo). Então, estou me perguntando se os processos em execução foram encerrados corretamente? Especialmente no Fedora (novamente, cerca de 2 segundos), dificilmente posso imaginar que todo processo tenha tempo suficiente para terminar.
Presumo que todos os processos do usuário foram fechados pelo usuário (manualmente) antes que o comando shutdown seja emitido, portanto, apenas os serviços do sistema permanecem (ainda assim, eles também podem ter coisas para fazer na saída).
Então eu escrevi um pequeno programa que captura a maioria dos sinais e, se um número (de segundos) for fornecido, ele esperará antes de sair. Fora isso, não faz nada. Então - primeiro em um sistema Debian - iniciei com um atraso de 60 segundos. Quando recebeu um SIGHUP (presumo que seu shell pai tenha sido encerrado), ele iniciou a contagem regressiva de 60 segundos. Após 10 segundos, recebeu um SIGTERM amigável. Meu programa ignorou esse sinal e continuou a contagem regressiva - até o segundo 40, quando morreu tragicamente. Então, 20 segundos depois de ser solicitado o encerramento (SIGHUP), ele foi SIGKILLed.
Agora o mesmo teste no Fedora 17 (3.5.3-1.fc17.x86_64):
Sinal capturado 1.
Tempo de execução: 8 segundo(s)
Atrasando a finalização por 60 segundo(s)...
60...
Sinal capturado 15 - ignorando!
59...
58...
Nem um segundo após o SIGHUP, ele recebe o SIGTERM. Um programador pode atrasar o encerramento de seu programa após um SIGTERM, para finalizar trabalhos, salvar configurações e assim por diante (ao contrário, talvez, após um SIGINT). Meu programa leva 2 segundos antes de ser eliminado.
E se um processo em execução for interrompido ao salvar algumas configurações (arquivo de configurações corrompido?) ou algum tipo de daemon (por exemplo, algum servidor de arquivos) estiver gravando dados armazenados em cache no disco (dados corrompidos?)?
Responder1
Os serviços podem especificar como desejam ser encerrados em seus *.service
arquivos. Você pode selecionar qualquer tempo limite que desejar, não precisa viver com o padrão. Se você tiver o postgreSQL ou o mysqld instalado, consulte seus arquivos de serviço para ver como eles organizam um desligamento limpo.