????說起如何后臺(tái)運(yùn)行一個(gè)程序,相信很多同學(xué)都會(huì)第一時(shí)間想起&馅笙。但是&并不是萬能的厉亏,這里總結(jié)一下后臺(tái)運(yùn)行進(jìn)程幾種方法爱只。
一、為什么&不能保證一個(gè)程序后臺(tái)運(yùn)行窝趣?
? ? 1. 首先我們要弄清楚為啥&不能保證一個(gè)程序后臺(tái)運(yùn)行训柴,非得加上nohup呢幻馁?先做一個(gè)測(cè)試。
?? ?????如下膘滨,通過 ./test.sh &后臺(tái)運(yùn)行一個(gè)進(jìn)程稀拐,可以通過 jobs -l 查詢后臺(tái)進(jìn)程的pid。
????? ??然后直接關(guān)閉終端窗口铲咨,再打開終端鸣驱,會(huì)發(fā)現(xiàn)在后臺(tái)運(yùn)行的test進(jìn)程消失了蝠咆。
????????測(cè)試說明刚操,光靠&是沒法可靠保證程序后臺(tái)運(yùn)行的。
? ? 2. 為什么關(guān)閉終端會(huì)導(dǎo)致后臺(tái)運(yùn)行的進(jìn)程退出呢坚冀?
????????內(nèi)核發(fā)現(xiàn)終端關(guān)閉鉴逞,會(huì)給該終端所有的進(jìn)程(包括前后臺(tái)進(jìn)程)發(fā)送SIGHUP信號(hào)构捡。進(jìn)程受到SIGHUP信號(hào)便退出了。
????????PS: 這里所謂終端關(guān)閉就是指內(nèi)核感知不到終端了滑凉,例如遠(yuǎn)程登錄時(shí)的網(wǎng)絡(luò)斷開喘帚、sshd 掛掉吹由、手動(dòng)叉掉 ssh 登陸窗口之類的情況也算在內(nèi)。
二倾鲫、如何保證進(jìn)程不會(huì)被SIGHUP信號(hào)終止级乍?
????1. nohup + &
????????先看一下man中關(guān)于nohup的描述:運(yùn)行一個(gè)command,并且免疫 hangup甚淡,即免疫SIGHUP信號(hào)捅厂。
????????但是nohup命令無法使進(jìn)程后臺(tái)運(yùn)行焙贷。所以可以將nohup和&結(jié)合起來辙芍,實(shí)現(xiàn)后臺(tái)運(yùn)行進(jìn)程羹与,并且免疫SIGHUP信號(hào)庶灿,這樣保證后臺(tái)進(jìn)程不會(huì)被SIGHUP信號(hào)終止往踢。如:
? ????? # nohup ./test > /dev/null 2>&1 &
????? ? PS:nohup默認(rèn)會(huì)將輸出重定向到一個(gè)nohup.out文件中,可以自己根據(jù)需要進(jìn)行重定向利职。
? ? 2. screen
????????Screen是一個(gè)用于終端切換到命令瘦癌。只要Screen本身沒有終止,在其內(nèi)部運(yùn)行的會(huì)話都可以恢復(fù)哮伟。這一點(diǎn)對(duì)于遠(yuǎn)程登錄的用戶特別有用——即使網(wǎng)絡(luò)連接中斷楞黄,用戶也不會(huì)失去對(duì)已經(jīng)打開的命令行會(huì)話的控制抡驼。只要再次登錄到主機(jī)上執(zhí)行screen -r就可以恢復(fù)會(huì)話的運(yùn)行致盟。同樣在暫時(shí)離開的時(shí)候,也可以執(zhí)行分離命令detach馏锡,在保證里面的程序正常運(yùn)行的情況下讓Screen掛起(切換到后臺(tái))。
????? ? man screen如下:
????????通過 screen 命令創(chuàng)建的環(huán)境下運(yùn)行的終端命令杯道,其父進(jìn)程不是 sshd 登錄會(huì)話匪煌,而是 screen。這樣就可以即避免用戶退出進(jìn)程消失的問題党巾,又隨時(shí)能重新接管回終端繼續(xù)操作萎庭。
? ? ????使用方法:
# screen -dmS screen_test? ? ? ? ? ?//創(chuàng)建一個(gè)screen
# screen -list? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//查看系統(tǒng)中已存在的screen
# screen -r screen_test? ? ? ? ? ? ? ? //連接某個(gè)screen
Ctrl+A+D 鍵? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //從當(dāng)前screen中離開
? ? 3. service 或 systemctl
????????將進(jìn)程的啟動(dòng)加入到系統(tǒng)服務(wù)中,如service或者sysctmctl齿拂。
? ? 4.?daemontools
????????使用daemontools第三方工具實(shí)現(xiàn)后臺(tái)運(yùn)行管理驳规,如supervisord。