Разница между "-D" и "&" в bash скрипте - PullRequest
0 голосов
/ 23 марта 2020

Согласно этому docker учебнику

В чем разница между

./my_first_process -D

./my_main_process &

Они оба кажутся разблокированными bash скрипт и запуск в фоновом режиме

Ответы [ 2 ]

3 голосов
/ 23 марта 2020

& говорит оболочке поместить команду, которая предшествует ей, в фоновом режиме. -D - это просто флаг, который передается в my_first_process и интерпретируется им; он не имеет абсолютно ничего общего с оболочкой.

Вам придется заглянуть в документацию my_first_process, чтобы увидеть, что делает -D ... это может означать что угодно. Например, npm, -D означает «разработка», тогда как в некоторых других инструментах это может означать «каталог». В diff это означает «Вывод объединенного файла для отображения различий` #ifdef NAME '».

1 голос
/ 24 марта 2020

Некоторые программы, по соглашению, принимают -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 &
...