Если сценарий работает нормально из командной строки, то почему этот же сценарий переходит в состояние зомби после запуска через cron и как вы будете устранять неполадки?
Вот следующий реальный пример:
[root@abc ~]# ps ax | grep Z
23880 ? Zs 0:00 [checkloadadv.sh] <defunct>
23926 pts/0 S+ 0:00 grep Z
[root@abc ~]# strace -p 23880
attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
[root@abc ~]# pstree | grep checkload
init-+-crond---crond-+-checkloadadv.sh
[root@abc ~]# bash /usr/bin/checkloadadv.sh
System Load is OK : 0.05
process
zombie-process
Рахул Патил
источник
источник
Ответы:
Как настоящий зомби, процесс зомби не может быть убит, потому что он уже мертв.
Как это происходит
Когда в Linux / Unix процесс умирает / завершается, вся информация из процесса удаляется из системной памяти, остается только дескриптор процесса. Процесс попадания в состояние Z (зомби). Его родительский процесс получает сигнал от ядра:
SIGCHLD
это означает, что один из его дочерних процессов завершается, прерывается или возобновляет работу после прерывания (в нашем случае он просто завершается).Теперь родительский процесс должен выполнить
wait()
системный вызов для чтения состояния выхода и другой информации из своего дочернего процесса. Затем дескриптор удаляется из памяти, и процесс больше не является зомби.Если родительский процесс никогда не вызывает
wait()
системный вызов, дескриптор процесса зомби остается в памяти и пожирает мозги. Обычно вы не видите зомби-процессов, потому что описанная выше процедура занимает меньше времени.Рассвет мертвецов
Каждый дескриптор процесса требует очень небольшого объема памяти, поэтому несколько зомби не очень опасны (как в реальной жизни). Одна проблема заключается в том, что каждый процесс-зомби сохраняет свой идентификатор процесса, а операционная система Linux / Unix имеет ограниченное количество идентификаторов pid. Если неправильно запрограммированное программное обеспечение генерирует много процессов-зомби, может случиться так, что процессы больше не могут быть запущены, потому что больше нет доступных идентификаторов процессов.
Так что, если они в огромных группах, они очень опасны (как во многих фильмах демонстрируется очень хорошо)
Как мы можем защитить себя от орды зомби?
Сработал выстрел в голову, но я не знаю команду для этого (SIGKILL не сработает, потому что процесс уже мертв).
Ну, вы можете отправить SIGCHLD через kill родительскому процессу, но когда он игнорирует этот сигнал, что тогда? Ваша единственная возможность - убить родительский процесс, и процесс инициации «принимает» зомби.
wait()
Инициал периодически вызывает системный вызов, чтобы убрать своих детей-зомби.В твоем случае
В вашем случае вы должны отправить SIGCHLD процессу crond:
Затем из другого терминала:
Выход:
Вы видите, что
wait4()
системный вызов возвращает -1 ECHILD, что означает, что там нет дочерних процессов. Итак, вывод таков: cron реагирует на системный вызов SIGCHLD и не должен форсировать апокалипсис.источник
Если родительский поток будет убит раньше, чем его дочерний поток, все дочерние потоки станут процессами-зомби.
источник