bash setsid nohup ./prog & - $! не указывает на дочерний процесс
Я пытался получить pid процесса, с которым я бежал setsid
и который должен работать в фоновом режиме, как это:
test.sh:
#/bin/bash
setsid nohup ./my_program &
echo $!
если я бегу ./test.sh
это напечатает pid my_program
процесс, и это именно то, что мне нужно. Но если запустить эту команду одну за другой в моей оболочке, вот так:
$ setsid nohup ./my_program &
$ echo $!
Это даст мне pid setsid
команда (или может быть что-то еще, но это почти всегда дает мне pid my_program
минус один).
Что здесь происходит? Почему результаты команд, которые я сам запускал в терминале, отличаются от результатов команд test.sh
скрипт?
Кстати, может быть, вы знаете какой-то простой способ процесса, который я начал с setsid и который мне нужно запустить в фоновом режиме?
2 ответа
Репост комментариев выше в качестве ответа:
Это потому, что setsid разветвляет текущий процесс, только если он является лидером группы процессов. Подробное объяснение можно найти здесь.
Чтобы получить pid процесса, выполняемого через setsid, можно попробовать подходы, приведенные здесь.
setsid вызовет fork, чтобы убедиться, что он создает новую группу процессов, а также новый сеанс, поэтому полученный pid не будет соответствовать pid setsid. Самый простой обходной путь - my_program сохраняет свой pid в файл.
Когда вы позже захотите отправить kill в my_program, вы должны проверить, что pid действительно соответствует программе my_program через файловую систему /proc или вызывает команду ps с магическим кодом вокруг нее. (Это очень распространенный метод, используемый многими демонами)