Яка різниця між nohup і ampersand


243

Обидва nohup myprocess.out &або myprocess.out &встановіть myprocess.out для запуску у фоновому режимі. Після того як я відключив термінал, процес все ще працює. Яка різниця між ними?


яку оболонку ви використовуєте? поведінка змінюється в різних снарядах
shx2

1
баш І я знаю, чому зараз відповідно до відповіді @nemo.
Яркі

@Yarkee, якщо відповідь відповідає вашій проблемі, будь-ласка, позначте питання прийнятим (прапорець під голосами відповіді), щоб воно не зависало як невідповідальне. Ви повинні зробити це для всіх своїх питань :)
nemo

1
shutdownслід уникати як терміна з конкретним значенням Linux exit.
Патрісіо Бертоні,

Відповіді:


317

nohupвловлює сигнал зависання (див. man 7 signal), поки амперсанд не робить (за винятком того, що оболонка налаштована таким чином або взагалі не надсилається SIGHUP).

Зазвичай при запуску команди, що використовує &та після цього виходить з оболонки, оболонка припиняє підкоманду сигналом зависання ( kill -SIGHUP <pid>). Це можна запобігти використанню nohup, оскільки він ловить сигнал і ігнорує його, щоб він ніколи не дійшов до фактичного застосування.

Якщо ви використовуєте bash, ви можете скористатися командою, shopt | grep huponщоб дізнатись, чи надсилає ваша оболонка SIGHUP дочірнім процесам чи ні. Якщо він вимкнений, процеси не припинятимуться, як це здається вам. Більше інформації про те, як bash припиняє програми, можна знайти тут .

Бувають випадки, коли nohupце не працює, наприклад, коли процес, який ви починаєте, знову підключає SIGHUPсигнал, як це відбувається саме тут .


Можливо, варто відзначити, що якраз &це призводить до того, що підкоманда не отримує певних сигналів (наприклад, SIGINT). nohupпо суті додає SIGHUPдо списку сигналів, які не розповсюджуються.
studgeek

46

myprocess.out &запустив би процес у фоновому режимі, використовуючи нижню частину корпусу. Якщо поточна оболонка припиняється (скажімо, виходу з системи), усі підзаголовки також припиняються, тому фоновий процес також буде припинений. Команда nohup ігнорує HUPсигнал, і, навіть якщо поточна оболонка припинена, нижня частина і myprocess.outпродовжує працювати у фоновому режимі. Ще одна відмінність полягає в тому, що &поодинці не перенаправляє stdout / stderr, тому якщо є якісь вихідні або помилкові, вони відображаються на терміналі. nohup з іншого боку перенаправляє stdout / stderr на nohup.outабо $HOME/nohup.out.


6
Я біжу myprocess.out &і виходжу з оболонки. Однак, коли я використовую ps aux | grep myprocess.outв іншій оболонці, я все ще можу знайти "myprocess.out". Це означає, що процес ще триває, а не припиняється.
Яркі

1
@amit_g При знищенні батьківської оболонки kill -9не буде SIGHUP, оскільки для цього знадобиться батьківська оболонка для обробки SIGKILL, що не може.
nemo

2
Перевірити магазин | grep hupon, як згадується в іншій відповіді.
amit_g

31

Більшу частину часу ми входимо на віддалений сервер за допомогою ssh. Якщо ви запускаєте скрипт оболонки і виходите з системи, тоді процес знищується. Nohup допомагає продовжувати запускати сценарій у фоновому режимі навіть після виходу з оболонки.

Nohup command name &
eg: nohup sh script.sh &

Nohup ловить сигнали HUP. Nohup не виводить завдання автоматично на задній план. Нам потрібно сказати, що явно використовуючи &


Дякую. Не чекав вашої відповіді, але те, що вона тут, чудово. Він відповідає на запитання, яке я не задавав: D
Вайбхав Каушаль

26

Використання ampersand (&) запустить команду в дочірньому процесі (дочірній до поточного сеансу bash). Однак, коли ви виходите з сеансу, всі дочірні процеси будуть знищені.

використання nohup + ampersand (&) зробить те ж саме, за винятком того, що коли сеанс закінчиться, батько дочірнього процесу буде змінено на "1", що є "init" процесом, тим самим уберегши від загибелі дитини.


7

Виправте мене, якщо я помиляюся

  nohup myprocess.out &

nohup вловлює сигнал зависання, а це означає, що він посилатиме процес, коли термінал закритий.

 myprocess.out &

Процес може запускатися, але припиняється, коли термінал закритий.

nohup myprocess.out

Процес здатний запустити навіть закритий термінал, але ви можете зупинити процес, натиснувши клавішу ctrl+ zу терміналі. Crt+ zне працює, якщо &існує.


2

Команда nohup - це утиліта, що маскує сигнал, і вловлює сигнал зависання. Де амперсанд не вловлює сигнали відключення. Оболонка припиняє команду sub із сигналом відключення під час виконання команди з використанням & та виходу з оболонки. Це можна запобігти, використовуючи nohup, оскільки він ловить сигнал. Команда Nohup приймає сигнал відключення, який може бути надісланий ядром процесу та блокувати їх. Команда Nohup корисна в тих випадках, коли користувач хоче почати тривале виходи із програми або закрити вікно, в якому процес був ініційований. Будь-яка з цих дій зазвичай вимагає ядра зависнути на програмі, але обгортка nohup дозволить продовжувати процес. Використання ampersand запустить команду в дочірньому процесі та цьому дочірньому поточному сеансі bash. Коли ви виходите з сесії, всі дочірні процеси цього процесу будуть вбиті. Амперсанд відноситься до контролю за роботою активної оболонки. Це корисно для запуску процесу у сеансі у фоновому режимі.


0

Є багато випадків, коли невеликі відмінності між середовищами можуть вас вкусити. Це той, в який я забіг недавно. Яка різниця між цими двома командами?

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 як методу запуску до другого скрипту програма продовжує працювати, навіть якщо скрипти вийдуть, і така поведінка стала послідовною в обох середовищах.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.