Кто демонизирует?

Существуют различные уловки для демонстрации процесса Linux, то есть для выполнения команды после закрытия терминала.

nohup используется для этой цели, а комбинация _2 _ / _ 3_ может использоваться в программе на языке C, чтобы сделать себя процессом демона.

Выше были мои знания о демоне linux, но сегодня я заметил, что выход из терминала на самом деле не завершает процессы, запущенные с & в конце команды.

$ while :; do echo "hi" >> temp.log ; done &
[1] 11108
$ ps -ef | grep 11108
username   11108 11076 83 15:25 pts/0    00:00:05 /bin/sh
username   11116 11076  0 15:25 pts/0    00:00:00 grep 11108
$ exit
(after reconnecting)
$ ps -ef | grep 11108
username   11108     1 91 15:25 pts/0    00:00:17 /bin/sh
username   11130 11540  0 15:25 pts/0    00:00:00 grep 11108

Очевидно, PPID процесса изменился на 1, что означает, что он каким-то образом был демонизирован.

Это противоречит моим знаниям о том, что & недостаточно и нужно использовать nohup или другие уловки для процесса «демон».

Кто-нибудь знает, кто это демонизирует?

Я использую хост CentOS 6.3, и putty / cygwin / sshclient дал тот же результат.


person lyomi    schedule 06.12.2012    source источник
comment
stackoverflow.com/ questions / 958249 /   -  person Grumpy    schedule 06.12.2012


Ответы (1)


Вы можете демонизировать процесс, если он не отвечает на сигнал SIGHUP.

Когда оболочка bash завершается во время выполнения фоновых задач, оболочка bash отправляет SIGHUP (сигнал зависания) всем задачам. Однако bash не будет ждать полного завершения дочерних процессов. Если дочерний процесс не отвечает на сигнал SIGHUP, этот процесс становится бесхозным. (его родительский pid изменен на 1 - процесс инициализации - чтобы не стать бесполезным процессом зомби)

Выполнение субоболочки в основном не отвечает на сигналы SIGHUP, поэтому ваша команда все равно будет выполняться после выхода из первой оболочки.

person Kevin    schedule 06.12.2012
comment
Спасибо за четкое объяснение. Чего мне не хватало, так это того, что программы, написанные на C / C ++, имеют обработчик SIGHUP по умолчанию, который завершает свою работу, поэтому мне нужна была вещь _1 _ / _ 2_. В то время как сценарии оболочки игнорируют SIGHUP, поэтому мне не нужны другие демонизирующие уловки, кроме &. - person lyomi; 07.12.2012