Некоторые программы, по соглашению, принимают -D
в качестве инструкции для само-демонизации . Это выглядит примерно так:
- Вызовите
fork()
и завершите работу, если возвращается 0 (таким образом, выживает только ребенок). - Закройте stdin, stdout и stderr, если они присоединяются к консоли (в идеале, их файловые дескрипторы заменяются дескрипторами на
/dev/null
, поэтому запись не вызывает ошибку). - Вызовите
setsid()
, чтобы создать новый сеанс. - Вызовите
fork()
еще раз и выйдите, если он снова вернет 0.
Это гораздо больше работы, чем просто someprogram &
! Программа, которая само-демонизировалась, больше не может регистрироваться в терминале, и на нее больше не повлияет закрытие самого терминала. Это не относится к программе, которая только что запущена в фоновом режиме.
Чтобы получить что-то похожее на то же поведение из bash, правильный код будет выглядеть примерно так:
someprogram </dev/null >/dev/null 2>&1 & disown -h
.. .wherein disown -h
говорит оболочке не передавать SIGHUP этому процессу. Также нередко можно увидеть внешний инструмент nohup
, используемый для этой цели (хотя по умолчанию он перенаправляет stdout и stderr в файл с именем nohup.out
, если они направлены на TTY, конечная цель - убедиться, что они не направлены на терминал, и, таким образом, запись в них не перестает работать, если терминал отключается - достигается):
nohup someprogram >/dev/null &