關(guān)閉linux終端還讓程序繼續(xù)執(zhí)行的實(shí)現(xiàn)方式
一、前言
我們?cè)谑褂胠inux時(shí),會(huì)經(jīng)常要把一個(gè)程序放到后臺(tái)運(yùn)行,這時(shí)候就需要在程序的最后使用【&】符號(hào),但是當(dāng)直接關(guān)閉這個(gè)終端時(shí),程序就會(huì)退出
下面我介紹5種方法,在關(guān)閉終端后程序還繼續(xù)運(yùn)行。
二、思考
首先要考慮一個(gè)問(wèn)題,直接關(guān)閉終端為什么后臺(tái)程序就退出了?
那是因?yàn)橹苯雨P(guān)閉,終端會(huì)向當(dāng)前環(huán)境啟動(dòng)的后臺(tái)任務(wù)發(fā)送SIGHUP信號(hào),讓運(yùn)行的程序掛起,那么忽略SIGHUP信號(hào)就行啦。
三、nohup
最常用的命令就是【nohup】,從名字就看出是否掛起運(yùn)行命令,關(guān)閉終端或者退出某個(gè)賬號(hào),進(jìn)程也繼續(xù)保持運(yùn)行狀態(tài),同樣要配合【&】符號(hào)一起使用。
用法:nohup Command [ Arg … ] [&]
$ nohup sh test.sh & # 直接關(guān)閉當(dāng)前終端,再打開(kāi)一個(gè)查看 $ ps -few|grep test.sh
從上面的輸出可以看出,我們運(yùn)行的test.sh的父進(jìn)程變成了【PID 1】,由linux主進(jìn)程接管。
四、setsid
nohup是忽略SIGHUP信號(hào),那有沒(méi)有其他的思路?
使用setsid命令可以使程序打開(kāi)新的進(jìn)程,該進(jìn)程繼承了父進(jìn)程組的ID。
從下圖可以看到,test.sh腳本的父進(jìn)程已經(jīng)是init 1,此時(shí)不管關(guān)閉還是退出終端,已經(jīng)和后臺(tái)的程序沒(méi)有關(guān)系了。
$ setsid sh test.sh
setsid與nohup的一個(gè)重要區(qū)別是:不需要使用&壓入后臺(tái)。
此法使運(yùn)行的進(jìn)程以root身份運(yùn)行,多少有些安全隱患。
五、exit
使用exit命令退出終端,我們的程序還是會(huì)繼續(xù)運(yùn)行,這是為什么呢?
這是因?yàn)槭褂胑xit命令退出終端時(shí)不會(huì)向終端所屬任務(wù)發(fā)SIGHUP信號(hào),這是huponexit 配置項(xiàng)控制的,默認(rèn)是off,可以使用shopt 命令查看。
[root@api ~]# shopt |grep huponexit huponexit off
將huponexit 配置成on,再次使用exit命令退出,所屬的任務(wù)就會(huì)跟隨退出。
[root@api ~]# shopt -s huponexit [root@api ~]# shopt |grep huponexit huponexit on
六、trap
trap命令是linux內(nèi)置的命令
trap [接收到指定信號(hào)時(shí)將要采取的行動(dòng)] signal_spec
常見(jiàn)的信號(hào)如下:
信號(hào) | 值 | 描述 |
---|---|---|
1 | SIGHP | 掛起進(jìn)程 |
2 | SIGINT | 終止進(jìn)程 |
3 | SIGQUIT | 停止進(jìn)程 |
9 | SIGKILL | 無(wú)條件終止進(jìn)程 |
15 | SIGTERM | 盡可能終止進(jìn)程 |
17 | SIGSTOP | 無(wú)條件停止進(jìn)程,但不是終止進(jìn)程 |
18 | SIGTSTP | 停止或暫停進(jìn)程,但不終止進(jìn)程 |
19 | SIGCONT | 繼續(xù)運(yùn)行終止的進(jìn)程 |
當(dāng)一個(gè)腳本要在后臺(tái)運(yùn)行,不希望終端退出后關(guān)閉腳本程序,我們可以在的腳本中增加trap命令來(lái)忽略SIGHUP信號(hào)(掛起進(jìn)程)。
#!/bin/bash trap "" HUP while true;do date >> /root/test.txt sleep 1 done
七、screen
screen命令用于管理多個(gè)終端,它可以創(chuàng)建終端,讓程序在里面運(yùn)行。
screen sh test.sh &
從上圖可以看出,test.sh腳本的父進(jìn)程是screen終端進(jìn)程【PID 7806】,而screen終端的父進(jìn)程【PID 1】,同樣可以實(shí)現(xiàn)后臺(tái)的運(yùn)行。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
CentOS環(huán)境下安裝Redis3.0及phpredis擴(kuò)展測(cè)試示例
這篇文章主要介紹了CentOS環(huán)境下安裝Redis3.0及phpredis擴(kuò)展測(cè)試,結(jié)合實(shí)例形式分析了CentOS下Redis安裝相關(guān)步驟、命令及phpredis擴(kuò)展的測(cè)試代碼,需要的朋友可以參考下2018-04-04Linux上下行網(wǎng)速測(cè)試工具_(dá)speedtest-cli安裝使用方法
speedtest-cli是Linux下的一個(gè)上下行網(wǎng)速測(cè)試工具,是一個(gè)用Python寫(xiě)的命令行腳本,需要的朋友可以參考下2017-03-03解決Linux+Apache服務(wù)器URL區(qū)分大小寫(xiě)問(wèn)題
Linux服務(wù)器的大小寫(xiě)敏感有時(shí)候很不方便,在地址欄里一定要輸入準(zhǔn)確的URL才能訪問(wèn),對(duì)搜索引擎和用戶不是很友好,那么如何解決LINUX服務(wù)器URL的大小寫(xiě)問(wèn)題2020-01-01詳解Linux系統(tǒng)配置nginx的負(fù)載均衡
這篇文章主要介紹了詳解Linux系統(tǒng)配置nginx的負(fù)載均衡的相關(guān)資料,這里對(duì)負(fù)載均衡的幾種方式進(jìn)行了講解并附NGINX配置文件,需要的朋友可以參考下2017-03-03linux下用戶程序同內(nèi)核通信詳解(netlink機(jī)制)
這篇文章主要介紹了linux下用戶程序同內(nèi)核通信詳解(netlink機(jī)制),涉及netlink,內(nèi)核模塊,用戶程序的介紹等相關(guān)內(nèi)容,小編覺(jué)得還是挺不錯(cuò)的,這里分享給大家,需要的朋友可以參考下2018-01-01Linux服務(wù)器進(jìn)程退出了,但是顯存占用問(wèn)題的解決
這篇文章主要介紹了Linux服務(wù)器進(jìn)程退出了,但是顯存占用問(wèn)題的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09