Различия между «<команда> & disown» и «nohup <команда> & 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.

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

heemayl
источник