Eu corri para este problema uma vez quando o meu sistema estava executando processos ininterruptos. Nós entramos em uma situação muito desagradável, onde os processos do Apache aparentemente estavam esperando por algo do disco, e não poderia ser morto .
Até onde eu sei, ao desligar, o Linux envia SIGTERM
s para seus processos, e um SIGKILL
alguns segundos depois para aqueles que ousam desobedecer. No entanto, o próprio kernel protegerá esses processos se eles estiverem em estado ininterrupto: isso ajuda a evitar a perda de dados quando a chamada do sistema for interrompida envolve uma operação de E / S. No momento, não consigo pensar em mais nada capaz de descartar * a SIGKILL
, para que outros elementos de resposta possam ser trazidos até aqui.
* esta é uma maneira bastante simplificada (se não errônea) de vê-la, e não leva em consideração a assincronia do sinal. Veja o comentário de Gilles para mais detalhes sobre este ponto.
No entanto, quando se trata de processos ininterruptos ...
How to kill an uninterruptible process without rebooting: somehow make the system call terminate. Frequently the most effective manner to do this without hitting the power switch is to pull the power cord. You can also become a kernel hacker and make the driver use TASK_KILLABLE, as explained in the LWN article.
Você pode obter uma lista de todos os processos ininterruptos em execução com ...
$ ps -eo 'state,pid,args' | awk '$1 == "D" {print;}'
$ ps -eo 'state,pid,args' | grep -E '^D'
$ ps -eo 'state,pid,args' | egrep '^D'
...