Tl; dr:
Чому sleepпроцес може вижити, коли я виходжу з системи та термінал закритий? На мій погляд, nohupпід час виходу все, крім демонів і програм, буде вбито. Якщо sleepможна вижити таким чином, чи означає це, що я можу використовувати цей метод замість nohupкоманди?
Якщо bashекземпляр, породжений яким, sshне huponexitвстановив параметр, жоден спосіб не буде припинений після виходу / виходу, і коли huponexitпараметр встановлений, використання kill -9на оболонці не є хорошою альтернативою для використання nohupв дочірніх процесах оболонки; nohupна дочірніх процесах оболонки все одно захищатимуть їх від SIGHUPs, що не надходять від оболонки, і навіть коли це не важливо nohup, все-таки слід віддати перевагу, оскільки це дозволяє виграшно закінчити оболонку.
В bashє опція називається huponexit, що якщо набір зробить bashSIGHUP своїх дітей при виході / виході з системи;
В інтерактивних екземплярах, які не входять у систему, bash наприклад, в bashекземплярі, породженому gnome-terminalцією опцією, ця опція ігнорується; незалежно від того huponexit, встановлено чи не встановлено, bashдіти ніколи не будуть ВИДАЛЕНИМИ bashпісля виходу;
У випадках інтерактивного входу, bash наприклад, у bashвипадку, породженому екземпляром ssh, ця опція не ігнорується (однак вона за замовчуванням не встановлена); якщо huponexitвстановлено, bashдіти будуть ВИГОТОВЛЕНІ bashпри виході / виході; якщо huponexitце не встановлено, bashдіти не будуть ВИБІРЮТЬСЯ bashпісля виходу / виходу;
Отже, як правило, вихід / вихід із інтерактивного bashекземпляра входу , якщо не встановлено huponexitпараметр, оболонка SIGHUP не зробить її дочірніми, а вихід / вихід із інтерактивного bashекземпляра, що не входить , не зробить оболонку SIGHUP її дітьми незалежно;
Це, однак, не має значення в даному випадку: використання kill -9 sleepвиживуть незалежно, тому що вбиває його батьківський процес ( bash) не залишить шансів для останнього , щоб зробити що - небудь до першого (тобто, наприклад, якщо поточний bashекземпляр був Ввійти bashекземпляр і huponexitопція була встановлена, щоб ЗНАЧИТИ її).
Додаючи до цього, на відміну від інших сигналів (на зразок сигналу SIGHUP, що надсилається bash), сигнал SIGKILL ніколи не передається дочірнім процесам процесу, отже sleep, навіть не вбивається;
nohupзапускає процес, несприйнятливий до сигналів SIGHUP, який є чимось іншим; це запобіжить зависанню процесу після прийому сигналу SIGHUP, який у цьому випадку може бути отриманий інтерактивним bashекземпляром входу у випадку, якщо huponexitпараметр був встановлений і оболонка вийшла з ладу; тому технічно використання nohupдля запуску процесу в інтерактивному bashекземплярі входу з huponexitвимкненою опцією запобігає зависанню процесу при отриманні сигналу SIGHUP, але вихід із / виходу з оболонки не буде ВИБІР нею незалежно;
Однак у цілому, коли nohupце потрібно для запобігання надходженню сигналів SIGHUP з батьківської оболонки, немає жодної причини віддавати перевагу kill -9методу батьківського типу nohupдочірньому методу; натомість має бути навпаки.
Вбивство батьків за допомогою kill -9методу не залишає шансу батькові граціозно вийти, а запуск дитини за допомогою nohupметоду дозволяє батькові припинятися за допомогою інших сигналів, таких як SIGHUP (зробити приклад, який має сенс у контексті дитини почали використовувати nohup), які дозволяють їй вишукано вийти.
&буде перенаправляти процес на другий план (наприклад, демон) і продовжує працювати щонайбільше, хоча ви вийшли з системи.