Operations

Поиск и устранение зомби-процессов в GNU/Linux

Дочерний процесс в Unix-системе, завершивший своё выполнение, но ещё присутствующий в списке процессов операционной системы, называют зомби (англ. zombie process).

Найти 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

Profit!