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