Несуществующие процессы и их родительские процессы

Я наткнулся на этот пост:

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
Другие вопросы по тегам