Есть много случаев, когда небольшие различия между средами могут вас укусить. Это тот, в который я недавно столкнулся. В чем разница между этими двумя командами?
1 ~ $ nohup myprocess.out &
2 ~ $ myprocess.out &
Ответ такой же, как обычно - зависит.
nohup ловит сигнал зависания, а амперсанд - нет.
Что такое сигнал зависания?
SIGHUP - обнаружение зависания на управляющем терминале или прекращение управляющего процесса (значение: 1).
Обычно при запуске команды с использованием & и последующем выходе из оболочки оболочка завершает подкоманду сигналом зависания (например, kill -SIGHUP $ PID). Это можно предотвратить с помощью nohup, так как он ловит сигнал и игнорирует его, так что он никогда не достигает реального приложения.
Хорошо, но, как в этом случае, всегда есть «но». Нет никакой разницы между этими методами запуска, когда оболочка настроена таким образом, что она вообще не отправляет SIGHUP.
Если вы используете bash, вы можете использовать команду, указанную ниже, чтобы узнать, отправляет ли ваша оболочка SIGHUP своим дочерним процессам:
~ $ shopt | grep hupon
И более того - бывают случаи, когда nohup не работает. Например, когда процесс, который вы запускаете, повторно подключает сигнал NOHUP (это делается внутри, на уровне кода приложения).
В описанном случае отсутствие различий меня поразило, когда внутри скрипта запуска настраиваемой службы был вызов второго скрипта, который устанавливает и запускает соответствующее приложение без команды nohup.
В одной среде Linux все работало гладко, во второй приложение закрывалось сразу после выхода из второго сценария (обнаружение этого случая, конечно, заняло у меня гораздо больше времени, чем вы могли подумать: stuck_out_tongue :).
После добавления nohup в качестве метода запуска во второй сценарий приложение продолжает работать, даже если сценарии завершаются, и это поведение стало согласованным в обеих средах.