Каково различие между запущением программы как демон и разветвлением его в фон с '& '?

Попробуйте cdable_vars опция оболочки в ударе. Вы включаете его с shopt -s cdable_vars.

Затем необходимо установить переменные export dir1=/some/path. и наконец cd dir1, и т.д. Можно затем вставить его Ваш ~/.bashrc заставить его придерживаться.

47
23.11.2012, 21:24
4 ответа

Традиционный способ daemonizing:

fork()
setsid()
close(0) /* and /dev/null as fd 0, 1 and 2 */
close(1)
close(2)
fork()

Это гарантирует, что процесс больше не находится в той же группе процесса как терминал и таким образом не будет уничтожен вместе с ним. Перенаправление IO должно заставить вывод не появиться на терминале.

31
27.01.2020, 19:34
  • 1
    поэтому, если терминал, который порождает фоновый процесс (и) закрывается фоновый процесс, также завершится? –  user1561108 23.11.2012, 21:33
  • 2
    Процесс получит SIGHUP, когда терминал выйдет, обработчик по умолчанию для того сигнала должен завершить процесс. –  Dennis Kaarsemaker 23.11.2012, 21:35
  • 3
    добавьте & объяснение части к Вашему ответу. Это, кажется, неполно.. если Вы проверяете исходный вопрос. –  mtk 28.11.2012, 18:24
  • 4
    Поэтому рабочие вещи в фоновом режиме с и не заставляют процесс сделать что-либо, что специальный :) –  Dennis Kaarsemaker 28.11.2012, 19:42

Для демона, что Вы хотите, процесс, который не имеет никакой связи ни с чем. По крайней мере Вы хотите, чтобы это было на его собственной сессии, не присоединено к терминалу, не имело любой дескриптор файла, наследованный от родителя, открытого для чего-либо, не имело родителя, заботящегося о Вас (кроме init), имеют текущий каталог в / чтобы не предотвратить umount...

Для отсоединения от терминала Вы создаете новую сессию, однако, для создания сессии, Вы не должны быть группой (или сессия) лидер, настолько лучше всего должен разветвить новый процесс. Принятие родительских выходов, который также означает, что процесс не будет больше иметь родителя и будет принят init. Затем закройте все возможные дескрипторы файлов, Вас chdir("/") (нельзя закрыть текущий рабочий каталог для выпуска того ресурса как для дескрипторов файлов, делая / текущие рабочие каталоги, по крайней мере, не предотвращают размонтировавшиеся каталоги).

Поскольку тот процесс является лидером сессии, существует риск, что, если он когда-нибудь открывает оконечное устройство, это становится процессом управления того терминала. Разветвление во второй раз гарантирует, что этого не происходит.

На другом конце, и, в интерактивных оболочках, ветвлениях и создает новую группу процесса (чтобы не быть в группе приоритетного процесса терминала), и в неинтерактивных оболочках, разветвляет процесс и игнорирует SIGINT в нем. Это не отсоединяется от терминала, не закрывает дескрипторы файлов (хотя некоторые оболочки вновь откроют stdin для /dev/null)...

35
27.01.2020, 19:34

Различие между запущением программы как демон и разветвлением его к фону с помощью амперсанда в основном связано с владением.

Чаще всего родительский процесс демона является процессом init (самый первый процесс, который будет запущен в системе Unix), при этом демон является ребенком тех средств процесса, что это не находится под Вашим прямым управлением как непривилегированным пользователем. В то время как, с другой стороны, разветвляя программу/процесс к фону означает, что можно в любое время перезвонить ему к переднему плану и/или уничтожить его.

8
27.01.2020, 19:34
  • 1
    Также для ответа на вышеупомянутую техническую сторону отсоединения процесса по сравнению с хранением его как ребенок терминала можно ли попытаться запустить "nohup Firefox и" –  Odaym 23.11.2012, 22:01

С command & Ваш процесс будет уничтожен сигналом SIGHUP, когда родитель умрет.

У системных администраторов есть доступ к некоторым обходным решениям, все же.

В системе удара можно использовать:

(trap '' HUP; command) &

Это открывает подоболочку, прерывания HUP сигнал с пустым обработчиком и амперсандом/ветвлениями это.

Вывод мог бы все еще быть перенаправлен к несправедливости tty. Или заблудитесь.
Можно зафиксировать это с &>command.out, 1>output.out, или 2>errors.out

У Вас мог бы также быть доступ, в большинстве систем, к nohup команда.
nohup упрощает этот процесс значительно. Это довольно стандартно, но я нашел, что много busybox встроили дистрибутивы ARM, пропускающие его. Вы просто пишете:

nohup command &

.. и Вы сделаны. Вывод перенаправляется, IIRC, к nohup.out, но это имя файла может быть изменено с опцией.

7
27.01.2020, 19:34
  • 1
    Только, чтобы отметить, что с с ZSH можно отделить a command & позже от оболочки с disown который затем работает post-nohup. –  math 24.09.2013, 10:26

Теги

Похожие вопросы