2016-04-22 6 views
1

я пытался получить PID процесса я столкнулся с setsid и которые должны работать в фоновом режиме, как это:

test.sh: 

#/bin/bash 
setsid nohup ./my_program & 
echo $! 

если я бегу ./test.sh он напечатает идентификатор процесса my_program процесса и его именно то, что мне нужно. Но если запустить эти команды один за другим в моей оболочке, как это:

$ setsid nohup ./my_program & 
$ echo $! 

Это даст мне PID из setsid команды (или может быть что-то еще, но почти все время дает мне PID из my_program минус один) ,

Что здесь происходит? Почему результаты команд, которые я запускал в терминале самостоятельно, отличаются от результатов сценария test.sh?

Btw, может быть, вы знаете какой-то простой способ обработки, который я начал с setid и который мне нужно запустить в фоновом режиме?

+0

Возможно, это связано с поведением типа setsid? Это только вилки, если это лидер группы процессов; см. [здесь] (http://stackoverflow.com/a/9685973/1735215). – 0range

+0

Чтобы получить pid процесса, выполняемого через setid, вы можете попробовать [this] (http://stackoverflow.com/a/19767312/1735215) – 0range

+0

@ 0range да, я думаю, что первая ссылка именно то, что мне нужно. Большое спасибо! Не могли бы вы написать это как ответ, чтобы я мог принять его? – PepeHands

ответ

1

Repost комментариев выше в качестве ответа:

Это происходит потому, что setsid только текущий Сервер порождает процесс, если он является лидером группы процессов. Подробное объяснение можно найти here.

Чтобы получить pid процесса, выполняемого через setid, можно попробовать подходы here.

0

setsid будет вызывать fork, чтобы создать новую группу процессов, а также новый сеанс, поэтому полученный pid не будет соответствовать pid setid. Самая чистая работа - это то, что my_program сохраняет свой pid в файл.

Когда вы позже захотите отправить kill в my_program, вы должны проверить, действительно ли pid соответствует программе с именем my_program через файловую систему/proc или вызывает команду ps с некоторым магическим кодом. (Это очень распространенный метод, используемый многими демонами)