Відповіді:
Що краще, риба чи велосипед? nohup
і exec
робити різні речі.
exec
замінює оболонку іншою програмою. Використання exec
в простому фоновому завданні не корисно: exec myprogram; more stuff
замінює оболонку myprogram
і не працює more stuff
, на відміну від myprogram; more stuff
запуску, more stuff
коли myprogram
припиняється; але exec myprogram & more stuff
починається myprogram
на задньому плані, а потім працює more stuff
, так само, як myprogram & more stuff
.
nohup
запускає конкретну програму з ігнорованим сигналом SIGHUP. Коли термінал закритий, ядро відправляє SIGHUP до керуючого процесу в цьому терміналі (тобто оболонці). Оболонка в свою чергу посилає SIGHUP на всі завдання, що виконуються у фоновому режимі. Запуск роботи з nohup
не дозволяє вбити її таким чином, якщо термінал загине (що трапляється, наприклад, якщо ви ввійшли в систему дистанційно і припинилося з'єднання, або якщо ви закриєте емулятор терміналу).
nohup
також переспрямовує вихід програми у файл nohup.out
. Це дозволяє уникнути загибелі програми, оскільки вона не в змозі записати на свій вихід або помилку. Зверніть увагу, що nohup
вхід не перенаправляє. Щоб повністю відключити програму від терміналу, де ви її запустили, використовуйте
nohup myprogram </dev/null >myprogram.log 2>&1 &
exec firefox
оболонка більше не працює: її замінено на firefox
. Можна подумати exec
як поєднання виходу з програми та запуску нової, але збереження того ж ідентифікатора процесу. Термінал продовжує працювати , тому що нічого не сказав це зупинити. Після пізнього виходу з Firefox firefox
процес припиняється. Термінал помічає, що його дочірній процес закінчився, і тому він закінчується по черзі.
exec &
=> виконує процес як фоновий процес, щоб ви могли продовжувати використовувати той же термінал для інших завдань.
nohup
=> уникає всіх SIGHUP (сигнал завершення) і продовжує виконання, навіть якщо термінал закритий.
exec
процес вмирає, коли SIGHUP
отримано a , але nohup
процес триває.
exec
замінює запущений процес, але це, здається, не відбувається, коли ви використовуєте &
для тла команди exec'd. Ні в баш, ні в шш.
exec smth &
це те саме, що (exec smth) &
, чи не так?
(exec smth) &
. Але я не очікував би, що це буде однаково - я б очікував, що це синтаксична помилка, як ви можете виконати процес (замінивши себе), а потім перетворити фоновий процес у exec'd? Ти більше не для цього.
Оболонка, вбудована в команду, exec <command>
замінює оболонку <command>
, не створюється новий процес, не створюється новий PID. Після завершення роботи <command>
ваш термінал закриється. Запустивши його у фоновому режимі, спочатку створюється підшалл, який потім аналогічно відразу замінюється <command>
.
nohup <command>
Команда буде працювати , <command>
але immume , щоб вбити зависання (-S 1) , тому він не буде припинений , коли оболонка, термінал , з якого він був запущений в тому, закритий. Запустивши його у фоновому режимі, спочатку створюється підшалл, і команда працює у фоновому режимі, повертаючи вас у підказку.
У сценаріях негайний ефект є більш-менш однаковим, але <command>
його починає ваш сценарій, і сценарій буде продовжуватися, не чекаючи <command>
початку, відправки виводу або завершення.
script.sh &
чи робиш exec script.sh &
. В обох випадках команда виконується в дочірньому процесі, вона не замінює процес виклику, див.: Paste.alacon.org/44474 (занадто довго, щоб копіювати її тут у коментарі…). Що я роблю неправильно?
Ви не можете порівнювати nohup
їх exec
. Коли ви запускаєте виконуваний файл nohup
, процес не загине при виході (ssh сесія); зазвичай nohup
використовується nice
для запуску процесів з нижчим пріоритетом. HUP
Сигнал, за угодою, то , як термінал попереджає залежні процеси виходу з системи