Демонизировать процесс в оболочке?


9

http://linuxg.net/how-to-transform-a-process-into-a-daemon-in-linux-unix/ приводит пример демонизации процесса в bash:

$ nohup firefox& &> /dev/null

Если я не ошибаюсь, команда такая же, как "nohup and background a process". Но разве демон не является чем-то большим, чем простой процесс?

Какие шаги здесь отсутствуют, чтобы демонизировать процесс?

Например, не требуется ли изменение родительского процесса при демонизации процесса? Если да, как ты это делаешь в bash? Я все еще пытаюсь понять связанный ответ https://unix.stackexchange.com/a/177361/674 .

Какие еще шаги и условия?

Смотрите мой связанный вопрос https://stackoverflow.com/q/35705451/156458


1
зависит от вашего определения демонов. Если вы просто имеете в виду работать в фоновом режиме без подключения к терминалу, тогда да, вы запускаете firefox как демон. «стандартные» демоны, однако, обычно не запускаются пользователями, имеют сценарий инициализации и протоколирование, и, как правило, это своего рода защита, часто apparmor или selinux, в зависимости от того, используете ли вы Ubuntu или Fedora (или аналогичную систему). Смотрите linfo.org/daemon.html .
— Пантера

1
Посмотрите start-stop-daemon в Debian; Я оставлю здесь связанный поток из переполнения стека stackoverflow.com/questions/16139940/…, который более интересен, чем необработанная страница руководства
— Rui F Ribeiro

Ответы:


10

Из статьи Википедии о демоне :

В среде Unix родительский процесс демона часто, но не всегда, является процессом init. Демон обычно создается процессом, который разветвляет дочерний процесс, а затем сразу же завершается, вызывая init принять дочерний процесс, или процессом init, непосредственно запускающим демон. Кроме того, демон, запускаемый путем разветвления и выхода, обычно должен выполнять другие операции, такие как отделение процесса от любого управляющего терминала (tty). Такие процедуры часто реализуются в различных вспомогательных процедурах, таких как daemon (3) в Unix.

Прочитайте man-страницу daemonфункции.

Запуск фоновой команды из оболочки, которая немедленно завершается, приводит к тому, что PPID процесса становится равным 1. Легко проверить:

# bash -c 'nohup sleep 10000 &>/dev/null & jobs -p %1'
1936
# ps -p 1936
      PID    PPID    PGID     WINPID   TTY         UID    STIME COMMAND
     1936       1    9104       9552  cons0       1009 17:28:12 /usr/bin/sleep

Как видите, процесс принадлежит PID 1, но все еще связан с TTY. Если я выйду из этой оболочки входа в систему, войду снова и сделаю psснова, TTY станет ?.

Прочитайте здесь, почему важно отсоединиться от TTY .

Используя setsid(часть util-linux):

# bash -c 'cd /; setsid sleep 10000 </dev/null &>/dev/null & jobs -p %1'
9864
# ps -p 9864
      PID    PPID    PGID     WINPID   TTY         UID    STIME COMMAND
     9864       1    9864       6632  ?           1009 17:40:35 /usr/bin/sleep

Я думаю, вам даже не нужно перенаправлять stdin, stdout и stderr.


3
Посмотрите на демонизировать . Помимо хорошего инструмента, у него есть довольно хорошие объяснения того, что такое демон.
— Джин Павловский

Мне просто любопытно, если вы знаете способ отделить процесс от tty, не выходя из оболочки, из которой был создан процесс?
— StoneThrow

1
@StoneThrow "без выхода из оболочки, из которой был создан процесс" Если вы используете bash -cоболочку, TTY не ассоциируется с процессом. Это действительно так, как он продемонстрировал это.
— Бруно Броноски

@StoneThrow, но выполнение этого теста echo "outer tty: $(tty)"; ls -la $(dirname $(tty)); bash -c 'echo "inner tty: $(tty)"; ls -la $(dirname $(tty));'покажет вам, что это тот же самый TTY для обоих, но продемонстрированное поведение получения TTY по- ?прежнему происходит, даже если вы никогда не «выходите из оболочки» и не закрываете TTY.
— Бруно Броноски

-1

Deamon по своему названию - не более чем программа, которая работает до тех пор, пока 1. система не выключится; 2. предлагается остановить. Кроме этого, оно не имеет магического значения.

В этих условиях запуск сценария bash в фоновом режиме с помощью nohup может классифицировать его как процесс-демон.

Что вы ожидаете найти и не найти? Если у вас есть какие-либо проблемы, укажите их с примером кода и примерами сегментов данных, чтобы попросить о дальнейшей помощи. Ваш вопрос в его нынешнем виде слишком широкий / общий.


Спасибо. Я думаю, что мой пост содержит все, что вы просили в своем последнем абзаце.
— Тим

4
Хм, это не правда. У демона нет управляющего терминала, нет стандартного вывода, стандартного вывода и других вещей. Прочтите первый раздел из раздела software.clapper.org/daemonize
— Рич Хомолка,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.