在 csh 上沒有 nohup,ssh 退出後後台作業仍在執行
我試圖了解
nohup
在 ssh 中使用後台命令的必要性。我的外殼是 CentOS 上的 csh。
- 即使在 ssh 退出後,下面的後台命令也會繼續執行。我希望只有
nohup
在命令前綴時才會發生這種情況。需要什麼場景
nohup
?ssh host 'sleep 80 >& /dev/null &'
- 我也嘗試了一個互動式shell,ssh退出後後台作業的PID仍然存在於主機上。
ssh host sleep 80 >& /dev/null & exit
- 我還嘗試使用
kill -HUP PID
而不是終止互動式會話exit
,並且在 ssh 退出後,後台作業的 PID 仍然存在於主機上。有什麼我做錯了嗎?
不,後台程序組(作業)預設情況下不會在會話負責人(shell)退出時或當其控制終端被拆除時被殺死。
發生這種情況時只有一些特殊情況:
**(1)後台作業*停止,此時核心*會發送一個
SIGHUP
/SIGCONT
對信號。如果信號未被程序擷取或忽略,則程序將終止。SIGHUP
已停止作業的定義是:任何包含已停止程序的作業。在阻塞系統呼叫上休眠的程序,如
nanosleep(2)
或read(2)
不被視為已停止。**(2)**一個程序嘗試讀取或寫入不再存在的終端,並且由於嘗試這樣做時遇到的錯誤而退出(根據自己的意願)。
**(3)**該作業實際上是一個前台作業。當會話領導者/控制程序(即外殼程序)終止時,核心向前台程序組發送信號。當它的控制終端被拆除時,
SIGHUP
控制程序本身會發出信號,這通常會導致它終止。SIGHUP
即使是從沒有作業控制的 shell 啟動的命令
&
實際上也是前台程序組的一部分(在大多數 shell 中——但不是在 csh 中——是執行腳本和子 shell時的預設設置)。**(4)**您正在使用類似
bash
or的外殼,當它本身發出信號時(根據上面的第 3 點,外殼是控制程序),或者只是當它發出信號時zsh
,它會竭盡全力向其所有作業發送信號退出(後者只是bash中的預設值,而不是預設值並受bash 中的選項影響)。SIGHUP``SIGHUP``zsh``shopt huponexit
csh shell(真實的or
csh
)tcsh
沒有orbash
的zsh
行為。在tcsh
(但不是在真實的csh
)中,您可以使用hup
內置命令啟動命令,以便在 shell 退出時將其 hup’ed:tcsh% hup sleep 3600 & tcsh% exit $ pgrep sleep [nothing]
**(5)**您的 init 系統會竭盡全力清理任何已終止的使用者會話。在其預設配置中,systemd將在延遲後從範圍內向所有程序發出信號,
SIGTERM
然後是 a ,因此無論如何都不會幫助您。此外,systemd 的作用域概念與 Unix 程序會話不匹配,因此執行命令 with也不會讓它逃脫它。SIGKILL``nohup``setsid(1)
您可能可以通過調整它們的預設值來改變 systemd 的行為
KillUserProcesses=yes
,KillMode=control-group
和選項。KillSignal=SIGTERM``SendSIGKILL=yes