Відмінності між "<командою> і відмовитись" від "nohup <command> & disown"


41

Це моє розуміння про використання &, disownі nohup:

  • <command>: запускає процес у поточному bashекземплярі терміналу на передньому плані (тобто процес вказаний як bashзавдання переднього плану та stdin, stdoutі stderrвсе ще пов'язаний з терміналом ); не застрахований від зависань ;
  • <command> &: Запускає процес в поточному Терміналі , bashнаприклад, у фоновому режимі (тобто процес вказано в якості bashфонового завдання і stdin, stdoutі stderrпо - , як і раніше пов'язані з терміналом ); не застрахований від зависань ;
  • <command> & disown: Запускає процес в поточному Терміналі , bashнаприклад, у фоновому режимі , але процес від'єднуються від bashсписку «s робочих місць» (тобто процес не вказано в якості bashпереднього плану / тла роботи і stdin, stdoutі stderrпо - , як і раніше прив'язані до терміналу ); несприйнятливий до зависань ;
  • nohup <command> & disown: Запускає процес в поточному Терміналі , bashнаприклад, у фоновому режимі , але процес від'єднуються від bashсписку «s робочих місць» (тобто процес не вказано в якості bashпереднього плану / тла роботи і stdin, stdoutі stderrякі НЕ все ще прив'язані до терміналу ) ; несприйнятливий до зависань ;

Так, крім nohup <command> & disownблокування stdinі перенаправлення stdoutі stderrна nohup.outза замовчуванням, то мені здається , що це можна вважати повністю еквівалентні <command> & disown.

Чи все вище правильно? Будь-яке помилкове уявлення?


1
Що ви маєте на увазі під "невразливим до зависань" та "не застрахованим від повішення"?
хаос

2
@chaos Я маю на увазі, що припинення / вбивство батьківського bashекземпляра не вб'є процес
kos

Відповіді:


32

Ваше розуміння в основному правильне. І те disownй nohupінше, що дозволяє вийти з запущеного сеансу оболонки, не зупиняючи запущені завдання. Деякі роз’яснення:

  • Немає приводу бігати nohup command & disown, nohupвже відмовиться від вас.

  • nohupце визначається POSIX , а disown НЕ . Це означає , що в той час як у багатьох оболонок (наприклад bash, zsh, ksh) є, інші (наприклад tcsh, csh, dashі sh) не матиме.

  • disownможе бути використаний після запуску команди, тоді як вона nohupповинна бути використана раніше.

Наскільки я можу сказати, фактичний ефект двох команд однаковий. У кожного з них є особливості, яких не вистачає іншим (див. help disownТа man nohup), але їх основна функція однакова, так.

Щоб отримати більш детальне обговорення цих інструментів та відмінностей між ними, подивіться відповіді тут:


11
Nohupі disownце не одне і те ж, і використовувати обидві команди разом НЕ зайве. Дивіться цю відповідь для глибокого опису
пам’ятка

7

Ваш перший-третій пункти здаються нормальними, хоча stdin, stdout and stderr are still bound to the terminalце не правильне поняття. stdinзавжди пов'язаний з терміналом у тому сенсі, що ви завжди вводили б ім'я файлу команді через термінал або способами, використовуючи термінал. stdout and stderr are still bound to the terminalгаразд.

У вас є stdin, stdout and stderr are not still bound to the terminalчетвертий пункт, що не вірно, як було сказано в моєму попередньому абзаці. Також тут ви використовуєте /dev/nullяк вхідний файл до command, наприклад, якщо команда є cat, ви використовуєте її як cat /dev/null.

Команда на вашій 5-й точці неправильно поставлена, ви використовували nohup <command> & disown, тоді як використання будь-якого з іншого nohupабо disownіншого не потрібне. Їх цілі однакові (ігнорувати SIGHUP), але вони функціонують дещо по-іншому. Отже команду можна спростити як nohup <command> &.

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