disown
заставляет оболочку не посылать SIGHUP на свое отрешенное задание, когда оболочка завершается, и
удаляет оторванное задание из управления заданиями оболочки.
Является ли первое результатом второго? Другими словами, если процесс, запущенный из оболочки, каким-либо образом удален из управления заданиями оболочки, не будет ли оболочка отправлять SIGHUP процессу, когда оболочка завершается?
disown -h
все еще держит процесс под контролем работы оболочки. Означает ли это, что disown -h
процесс все еще получает SIGHUP, отправленный из оболочки, но настраивает действие SIGHUP для процесса, чтобы он "игнорировался"? Это звучит похоже на nohup
.
$ sleep 123 & disown -h
[1] 26103
$ jobs
[1]+ Running sleep 123 &
$ fg 1
sleep 123
$ ^Z
[1]+ Stopped sleep 125
$ bg 1
[1]+ sleep 123 &
$ exit
$ ps aux | grep sleep
t 26103 0.0 0.0 14584 824 ? S 15:19 0:00 sleep 123
Делать disown -h
и nohup
работать эффективно одинаково, если не учитывать их разницу в использовании терминала?
Благодарю.
nohup
, вам нужно перенаправить stdin / stdout / stderr из TTY (если ваша исходная оболочка подключена к нему) самостоятельно. (OTOH, я на самом деле считаю, что это лучшая практика, чем полагаться на вопиющее жестко заданное значение по умолчанию, как./nohup.out
).Ответы:
nohup
иdisown -h
не совсем то же самое.При
disown
этом процесс удаляется из списка заданий в текущей интерактивной оболочке. Запускjobs
после запуска фонового процесса и его запускdisown
не будут отображать этот процесс как задание в оболочке. Отказавшееся задание не получитHUP
от оболочки при выходе (но см. Примечание в конце).При
disown -h
этом задание не удаляется из списка заданий, но оболочка не будет отправлять емуHUP
сигнал, если оно завершится (но см. Примечание в конце).nohup
Утилита игнорируетHUP
сигнал и запускает данную утилиту. Утилита наследует маску сигналаnohup
и поэтому также игнорируетHUP
сигнал. Когда оболочка завершается, этот процесс остается дочерним процессомnohup
(иnohup
повторно связан с нимinit
).Разница в том, что процесс начался с
nohup
игнорированияHUP
независимо от того, кто посылает сигнал. В отрекся процессы просто не послал наHUP
сигнал оболочкой , но по- прежнему может быть послан сигнал , например , отkill -s HUP <pid>
и не будет игнорировать это.Обратите внимание, что
HUP
отправляется на задания оболочки только еслиhuponexit
опция оболочки установлена, илиHUP
сигнал.Соответствующие биты из
bash
руководства (мой акцент):Связанный:
источник
bash: disown: nohup: no such job
и то же самое дляsleep
и5
отdisown nohup sleep 5 &
. Что вы имели в виду под этой второй командой из последнего предложения?&
там скучаю (и порядокnohup
иdisown
тоже был неправильным). Благодарю. Буду обновлять сейчас.disown
делает оболочку не отправленной SIGHUP дочернему элементу, удаляя дочерний элемент из списка заданий оболочки. Какdisown -h
добиться того же?Они разные:
disown удаляет задание из таблицы активных заданий. Затем продолжается с текущей работой. С -h процесс НЕ отправляется SIGHUP. Вместо этого его оставляют умирать с оболочкой, в которой он находится, когда он получает SIGHUP.
nohup игнорирует HUP. Тогда все, что было бы передано в терминал при закрытии процесса, вместо этого отправляется в файл
nohup.out
.источник