Это мое понимание об использовании &
, 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
.
Все ли это правильно? Любое заблуждение?
bash
экземпляра не приведет к остановке процессаОтветы:
Ваше понимание в основном правильно. Оба
disown
иnohup
используются, чтобы позволить вам выйти из сеанса работающей оболочки без остановки запущенных заданий. Некоторые уточнения:Там нет причин, чтобы бежать
nohup command & disown
,nohup
уже откажусь от него для вас.nohup
это определяется POSIX , аdisown
не . Это означает , что в то время как у многих оболочек (напримерbash
,zsh
,ksh
) есть, другие (напримерtcsh
,csh
,dash
иsh
) не будет иметь.disown
может использоваться после запуска команды, в то время какnohup
должна использоваться до.Насколько я могу судить, фактический эффект двух команд одинаков. У каждого из них есть особенности, которых нет у другого (см.
help disown
Иman nohup
), но их основная функция одинакова, да.Для более подробного обсуждения этих инструментов и различий между ними, посмотрите на ответы здесь:
disown -h
иnohup
работать эффективно одинаково?источник
Nohup
иdisown
это не одно и то же, и использование обеих команд НЕ является излишним. Смотрите этот ответ для более подробного описанияВаши пункты с первого по третий кажутся нормальными, хотя
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> &
.источник