(Por que) o Fedora não encerra corretamente todos os processos no desligamento?

0

Tenho notado que, com o Fedora 17, uma operação de desligamento (por exemplo, shutdown -h now) ficou muito mais rápida (parece ter no máximo 2 segundos). Então, eu estou querendo saber se os processos em execução são finalizados corretamente? Especialmente no Fedora (mais uma vez, cerca de 2 segundos), dificilmente posso imaginar que cada processo tenha tempo suficiente para terminar.

Estou assumindo que todo processo do usuário foi fechado pelo usuário (manualmente) antes do comando shutdown ser emitido, portanto apenas serviços do sistema são deixados (ainda, eles podem ter coisas para fazer na saída também).

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 - eu iniciei com um atraso de 60 segundos. Quando recebeu um SIGHUP (estou assumindo que seu shell pai foi terminado), ele iniciou a contagem regressiva de 60 segundos. Após 10 segundos, recebeu um amigável SIGTERM. Meu programa ignorou esse sinal e continuou a contagem regressiva - até o segundo 40, quando morreu tragicamente. Então, 20 segundos depois que foi dito para terminar (SIGHUP), foi SIGKILLed.

Agora o mesmo teste no Fedora 17 (3.5.3-1.fc17.x86_64):

Caught signal 1.
Runtime: 8 second(s)
Delaying termination for 60 second(s)...
60...
Caught signal 15 - ignoring!
59...
58...

Nem mesmo um segundo depois do SIGHUP, ele recebe o SIGTERM. Um programador pode atrasar o término de seu programa depois de um SIGTERM, para terminar tarefas, salvar configurações e assim por diante (ao contrário, talvez depois de um SIGINT). Meu programa recebe 2 segundos antes de ser morto.

E se um processo em execução for eliminado ao salvar algumas configurações (arquivo de configurações corrompido?) ou algum tipo de daemon (por exemplo, algum servidor de arquivos) estiver gravando dados em cache no disco (dados corrompidos?)?

    
por basic6 27.09.2012 / 22:03

1 resposta

1

Os serviços podem especificar como eles querem ser finalizados no arquivo *.service . Você pode selecionar qualquer tempo que quiser, você não precisa viver com o padrão. Se você tiver o postgreSQL ou o mysqld instalado, examine seus arquivos de serviço para ver como eles organizam um desligamento limpo.

    
por 27.09.2012 / 22:09