Linux系統(tǒng)下如何保持進(jìn)程在SSH客戶端斷開后仍繼續(xù)運(yùn)行?
本文介紹在Linux系統(tǒng)的ECS實(shí)例內(nèi),當(dāng)斷開SSH客戶端后,如何保持進(jìn)程繼續(xù)運(yùn)行的解決方案。
使用場景
在Linux系統(tǒng)中,在執(zhí)行一些運(yùn)行時(shí)間比較長的任務(wù)時(shí),必須等待執(zhí)行完畢才能斷開SSH連接或關(guān)閉客戶端軟件,否則可能會(huì)導(dǎo)致執(zhí)行中斷。本文介紹兩種保障程序在您退出登錄后持續(xù)運(yùn)行的方法。
方法一:使用nohup執(zhí)行命令
nohup,可以使運(yùn)行的命令忽略SIGHUP信號。因此,即使退出登錄,程序仍舊會(huì)繼續(xù)執(zhí)行。通常情況下,在nohup命令尾部加上&字符,才能將命令放至后臺(tái)執(zhí)行。具體示例如下所示。
nohup通常用于執(zhí)行無干預(yù)的自動(dòng)化程序或腳本,無法完成帶有交互的操作。
執(zhí)行如下命令,每秒輸出一行信息。
bash hello.sh
系統(tǒng)顯示類似如下。
使用nohup執(zhí)行命令。
在命令頭尾分別加上nohup和&,可以看到nohup輸出了一行信息,再Enter鍵就跳回了Shell命令行,此時(shí)命令已經(jīng)在后臺(tái)執(zhí)行了,nohup將命令的輸出重定向至當(dāng)前目錄的nohup.out文件中。同時(shí),nohup會(huì)將對應(yīng)程序的PID輸出,PID可用于需要中斷進(jìn)程時(shí)結(jié)束進(jìn)程。
說明在命令中也可以使用重定向?qū)⒊绦虻妮敵龈臑樽约合胍奈募缦滤荆瑒t程序的輸出就會(huì)寫到hello.log文件中。
nohup bash hello.sh >hello.log &
nohup bash hello.sh &
系統(tǒng)顯示類似如下。
執(zhí)行如下命令,可以持續(xù)的查看nohup.out的輸出,達(dá)到監(jiān)控程序的效果。
tail -f nohup.out
執(zhí)行如下命令,結(jié)束進(jìn)程。
kill -TRM [$PID]
說明[$PID]為之前nohup命令輸出的值。
方法二:使用screen執(zhí)行命令
GNU Screen一款由GNU計(jì)劃開發(fā)的用于命令行終端切換的軟件,可以當(dāng)做窗口管理器的命令行界面版本。只要Screen本身沒有被終止,在其內(nèi)部運(yùn)行的會(huì)話都可以恢復(fù),特別適合執(zhí)行一些運(yùn)行時(shí)間長的任務(wù)。
安裝screen工具。
Linux系統(tǒng)默認(rèn)沒有screen工具,需要先進(jìn)行安裝。
CentOS系列系統(tǒng)安裝命令如下所示。
說明CentOS 6與CentOS 8操作系統(tǒng)版本結(jié)束了生命周期(EOL),按照社區(qū)規(guī)則,CentOS 6/8的源地址內(nèi)容已移除。當(dāng)您在CentOS 6/8系統(tǒng)內(nèi)繼續(xù)使用默認(rèn)配置的源地址時(shí)會(huì)發(fā)生報(bào)錯(cuò)。建議您先切換CentOS 6/8的源地址,然后再進(jìn)行操作。具體操作,請參見CentOS 6 EOL如何切換源?和CentOS 8 EOL如何切換源?
yum install screen
Ubuntu系列系統(tǒng)安裝
sudo apt-get install screen
執(zhí)行如下命令,創(chuàng)建screen窗口。
screen -S [$Name]
執(zhí)行如下命令,列出screen窗口。
screen -ls
系統(tǒng)顯示類似如下。
當(dāng)需要運(yùn)行腳本、執(zhí)行程序時(shí),在命令前添加screen即可。
同時(shí)按Ctrl+a+d鍵,就可以退出SSH登錄,但不會(huì)影響screen程序的運(yùn)行。
需要繼續(xù)工作時(shí),登錄實(shí)例,然后執(zhí)行如下命令,恢復(fù)會(huì)話即可。
screen -r -d