Є багато випадків, коли невеликі відмінності між середовищами можуть вас вкусити. Це той, в який я забіг недавно. Яка різниця між цими двома командами?
1 ~ $ nohup myprocess.out &
2 ~ $ myprocess.out &
Відповідь така ж, як і звичайна - залежить.
nohup вловлює сигнал зависання, а амперсанд - ні.
Що таке сигнал зависання?
SIGHUP - зависання, виявлене на керуючому терміналі або загибель процесу керування (значення: 1).
Зазвичай при запуску команди, що використовує & та після цього, оболонка буде припиняти підкоманду сигналом підключення (наприклад, kill -SIGHUP $ PID). Це можна запобігти за допомогою nohup, оскільки він ловить сигнал і ігнорує його, щоб він ніколи не дійшов до фактичного застосування.
Чудово, але, як і в цьому випадку, завжди є "але". Немає різниці між цими методами запуску, коли оболонка налаштована таким чином, коли вона взагалі не надсилає SIGHUP.
Якщо ви використовуєте bash, ви можете скористатися вказаною нижче командою, щоб дізнатись, чи передає ваша оболонка SIGHUP своїм дочірнім процесам чи ні:
~ $ shopt | grep hupon
І більше того - бувають випадки, коли ногуп не працює. Наприклад, коли запущений процес знову підключає сигнал NOHUP (це робиться всередині, на рівні коду програми).
В описаному випадку відсутність відмінностей мене змусив, коли всередині скрипта запуску користувальницької служби був виклик другого сценарію, який налаштовує та запускає належну програму без команди nohup.
В одному середовищі Linux все працювало гладко, на другому додаток вийшов, як тільки вийшов другий скрипт (виявлення цього випадку, звичайно, зайняло у мене набагато більше часу, ніж можна подумати: stuck_out_tongue :).
Після додавання nohup як методу запуску до другого скрипту програма продовжує працювати, навіть якщо скрипти вийдуть, і така поведінка стала послідовною в обох середовищах.