Назад | Перейти на главную страницу

Процессы Unix не были убиты, но не запущены

У меня есть система, в которой работает какое-то специальное программное обеспечение, а затем может появиться 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 сигнал.