У меня есть система, в которой работает какое-то специальное программное обеспечение, а затем может появиться SIGHUP
. В результате SIGHUP
, процесс выполняет некоторую очистку и завершается, но не завершает свои длительные дочерние процессы.
После того, как система проработала несколько месяцев (и в ходе этого многие из моих процессов имели несчастье быть зависшими), я вижу на своем сервере Ubuntu 12.04, что у меня есть многие дочерние процессы, которые имеют init в качестве своих parent, но они не работают, не остановлены и не зомби - ps показывает их в состоянии "сна".
Если я попытаюсь связать один из этих процессов, процесс начнет работать, затем сразу же увидит, что он пытается обработать файлы, которых больше нет (временные файлы, которые были созданы и удалены несколько месяцев назад), и завершится:
# strace -fp 16111
Process 16111 attached - interrupt to quit
open("/tmp/some-file", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
write(2, "/tmp/some-file:"..., 59) = 59
close(3) = 0
exit_group(1) = ?
Process 16111 detached
Это также происходит, если я пытаюсь kill -STOP <pid>
(по крайней мере, я так думаю - после того, как я отправлю сигнал, процесс исчезает).
Есть идеи, что происходит?
Возможно, процесс получил один из оконечных сигналов остановки. Они могут быть отправлены, если фоновый процесс пытается связаться с терминалом. Существует три типа оконечных стоп-сигналов: TSTP
, TTIN
, и TTOU
. Мое первое предположение - процесс пытался читать с терминала, пока он находился в фоновом режиме, и поэтому получил TTIN
сигнал. К тому времени, когда вы возобновите его, подключив strace, терминала больше нет, поэтому он получает код ошибки вместо сигнала, если чтение повторяется. Другой способ разморозить процесс - отправить ему CONT
сигнал.