Несуществующие процессы и их родительские процессы
Я наткнулся на этот пост:
https://stackoverflow.com/questions/356722/killing-a-defunct-process-on-unix-system
"Вы убили процесс, но мертвый процесс не исчезает из таблицы процессов, пока его родительский процесс не выполнит задачу, называемую" пожинанием " (по сути, вызывая wait(3), чтобы этот процесс считал свое состояние выхода). Мертвые процессы, которые не были пожнены, называются "процессы зомби".
Вот мой несуществующий процесс:
ps aux | grep ruby
1000 11958 16.3 0.0 0 0 pts/3 Z Jul11 1065:28 [ruby] <defunct>
Вот что он должен был сделать:
RAILS_ENV=production bundle exec ruby lib/daemons/db_service_ctl start%
По сути, он запускает процесс демонов Rails. Я хотел перезапустить его, поэтому попытался убить его, но он отказался умирать, и теперь у меня уже не существует процесса.
Вот его родительский процесс:
ps -f 11958
UID PID PPID C STIME TTY STAT TIME CMD
1000 11958 11957 16 Jul11 pts/3 Z 1065:28 [ruby] <defunct>
Родительский процесс - 11957. Команда proc выглядит следующим образом:
/proc/11957 $ cat cmdline
/bin/sh./script/db_service.sh%
Это похоже на тот же сценарий оболочки, который я выполнил в процессе демонов!
Так как же это может быть родительским процессом?
1 ответ
Просто - скрипт db.service.sh
это родитель вашего процесса ruby запустил исполняемый файл (с PID 11958). Когда вы запускаете программу из сценария, это новый процесс, родительским элементом которого является сценарий, который ее вызвал. Рассмотрим этот скрипт:
#!/bin/bash
cat
Когда вы начинаете это как test.sh
, вы увидите, что bash является родителем, а cat дочерним:
xxx 4087 10976 0 08:29 pts/2 00:00:00 /bin/bash ./test.sh
xxx 4088 4087 0 08:29 pts/2 00:00:00 cat