2013-09-06 2 views
5

У меня есть дочерний процесс на переднем плане, и его отец уже вышел.Как узнать родительский процесс, если дочерний объект запущен в фоновом режиме, и родительский элемент уже вышел

файл proc/$pid/stat не содержит больше родительский идентификатор процесса, если родитель уже вышел и его отображение 1 вместо координат родительского PID

linux$cat /proc/6267/stat 
6267 (test3.sh) S 1 6265 ...... 
#    ^
#     | 
#  I expected to get the origin parent pid but I get 1 

Чтобы воспроизвести это поведение быстро мы можем использовать следующие сценарии

test2.sh

#!/bin/sh 
echo "test2=$$" 
./test3.sh & 

test3.sh

#!/bin/sh 
echo "test3=$$" 
sleep 1000 

исполнение:

linux$ ./test2.sh 
test2=6318 
test3=6319 
linux$ ps aux | grep test 
6319 root  1484 S {test3.sh} /bin/sh ./test3.sh 
linux$ cat /proc/6319/stat 
6319 (test3.sh) S 1 6318 2138 34816 6....... 
+10

Да, осиротевшие процессы «приняты» с помощью 'init' (pid' 1'). Это по дизайну, и, насколько мне известно, нет способа восстановить исходный родительский pid после выхода родительского процесса. –

+10

... и если вы сотворили путь вместе, pids в конечном итоге переработаны, поэтому число может не означать, что вы думаете, что это значит. – jthill

ответ

1

Я не думаю, что вы можете знать, родительский процесс после того, как (родитель) завершил выполнение. Но, возможно, вы можете запустить другую программу, которая контролирует вашу оригинальную программу и поддерживает файл журнала или что-то еще. И осиротевшие процессы, конечно, принимаются init.

Смежные вопросы