Ищем и убиваем zombie процессы
Apr 27, 2017 16:22 · 405 words · 2 minute read
Дочерний процесс в Unix-системе, завершивший своё выполнение, но ещё присутствующий в списке процессов операционной системы, чтобы дать родительскому процессу считать код завершения называют зомби (англ. zombie process, defunct process) — говорит нам Википедия.
Подробнее ознакомиться с возникновением зомби-процессов и связанными с ними проблемами можно на той же Wiki, а мы разберемся как вычислить такие процессы и “убить” их!
Найти zombie
-процесс можно несколькими способами, например:
top | grep zombie
или
ps aux | grep -w Z
или
ps -alx | awk '$10 ~ /STAT|Z/'
Итак, находим zombie
-процессы в нашей системе:
ps aux | grep -w Z
git 2512 0.6 0.0 0 0 ? Z 08:31 1:08 [grunt]
git 3574 0.0 0.0 0 0 ? Z кві13 0:48 [grunt]
root 12523 0.0 0.0 112652 1036 pts/5 S+ 11:22 0:00 grep --color=auto -w Z
git 13855 0.3 0.0 0 0 ? Z 07:07 0:47 [grunt]
git 14896 0.0 0.0 0 0 ? Z кві13 0:48 [grunt]
git 16213 0.0 0.0 0 0 ? Z кві03 0:44 [grunt]
git 24146 0.5 0.0 0 0 ? Z 07:49 1:11 [grunt]
git 26321 0.0 0.0 0 0 ? Z кві13 0:47 [grunt]
git 29765 0.5 0.0 0 0 ? Z 08:10 1:09 [grunt]
git 32440 0.0 0.0 0 0 ? Z кві13 0:47 [grunt]
“Убить” найденные zombie-процессы просто так не получится. Самый правильный вариант — найти родительский процесс и убить или перезапустить его. (Еще может помочь перезагрузка сервера, но это точно не наш путь). Находим родительские процессы (их PID’ы в третьей колонке):
ps ajx | grep -w Z
2475 2512 2427 2427 ? -1 Z 1004 1:08 [grunt]
3557 3574 3509 3509 ? -1 Z 1004 0:48 [grunt]
12350 12671 12671 12330 pts/5 12671 S+ 0 0:00 grep --color=auto -w Z
13839 13855 13791 13791 ? -1 Z 1004 0:47 [grunt]
14869 14896 14820 14820 ? -1 Z 1004 0:48 [grunt]
16192 16213 16144 16144 ? -1 Z 1004 0:44 [grunt]
24120 24146 24071 24071 ? -1 Z 1004 1:11 [grunt]
26290 26321 26236 26236 ? -1 Z 1004 0:47 [grunt]
29725 29765 29645 29645 ? -1 Z 1004 1:09 [grunt]
32423 32440 32375 32375 ? -1 Z 1004 0:47 [grunt]
При желании можно узнать больше подробностей о родительском процессе, например так:
ps auxww | grep 32375
root 12689 0.0 0.0 112648 1016 pts/5 S+ 11:23 0:00 grep --color=auto 32375
git 32375 0.0 0.0 211180 2892 ? Ss кві13 0:00 git-receive-pack /home/git/repo/ed.git
Дальше этот процесс можем просто “убить”:
kill -9 32375