關(guān)閉linux終端還讓程序繼續(xù)執(zhí)行的實(shí)現(xiàn)方式
一、前言
我們在使用linux時,會經(jīng)常要把一個程序放到后臺運(yùn)行,這時候就需要在程序的最后使用【&】符號,但是當(dāng)直接關(guān)閉這個終端時,程序就會退出
下面我介紹5種方法,在關(guān)閉終端后程序還繼續(xù)運(yùn)行。
二、思考
首先要考慮一個問題,直接關(guān)閉終端為什么后臺程序就退出了?
那是因?yàn)橹苯雨P(guān)閉,終端會向當(dāng)前環(huán)境啟動的后臺任務(wù)發(fā)送SIGHUP信號,讓運(yùn)行的程序掛起,那么忽略SIGHUP信號就行啦。
三、nohup
最常用的命令就是【nohup】,從名字就看出是否掛起運(yùn)行命令,關(guān)閉終端或者退出某個賬號,進(jìn)程也繼續(xù)保持運(yùn)行狀態(tài),同樣要配合【&】符號一起使用。
用法:nohup Command [ Arg … ] [&]
$ nohup sh test.sh & # 直接關(guān)閉當(dāng)前終端,再打開一個查看 $ ps -few|grep test.sh

從上面的輸出可以看出,我們運(yùn)行的test.sh的父進(jìn)程變成了【PID 1】,由linux主進(jìn)程接管。
四、setsid
nohup是忽略SIGHUP信號,那有沒有其他的思路?
使用setsid命令可以使程序打開新的進(jìn)程,該進(jìn)程繼承了父進(jìn)程組的ID。
從下圖可以看到,test.sh腳本的父進(jìn)程已經(jīng)是init 1,此時不管關(guān)閉還是退出終端,已經(jīng)和后臺的程序沒有關(guān)系了。
$ setsid sh test.sh

setsid與nohup的一個重要區(qū)別是:不需要使用&壓入后臺。
此法使運(yùn)行的進(jìn)程以root身份運(yùn)行,多少有些安全隱患。
五、exit
使用exit命令退出終端,我們的程序還是會繼續(xù)運(yùn)行,這是為什么呢?
這是因?yàn)槭褂胑xit命令退出終端時不會向終端所屬任務(wù)發(fā)SIGHUP信號,這是huponexit 配置項(xiàng)控制的,默認(rèn)是off,可以使用shopt 命令查看。
[root@api ~]# shopt |grep huponexit huponexit off

將huponexit 配置成on,再次使用exit命令退出,所屬的任務(wù)就會跟隨退出。
[root@api ~]# shopt -s huponexit [root@api ~]# shopt |grep huponexit huponexit on
六、trap
trap命令是linux內(nèi)置的命令
trap [接收到指定信號時將要采取的行動] signal_spec
常見的信號如下:
| 信號 | 值 | 描述 |
|---|---|---|
| 1 | SIGHP | 掛起進(jìn)程 |
| 2 | SIGINT | 終止進(jìn)程 |
| 3 | SIGQUIT | 停止進(jìn)程 |
| 9 | SIGKILL | 無條件終止進(jìn)程 |
| 15 | SIGTERM | 盡可能終止進(jìn)程 |
| 17 | SIGSTOP | 無條件停止進(jìn)程,但不是終止進(jìn)程 |
| 18 | SIGTSTP | 停止或暫停進(jìn)程,但不終止進(jìn)程 |
| 19 | SIGCONT | 繼續(xù)運(yùn)行終止的進(jìn)程 |
當(dāng)一個腳本要在后臺運(yùn)行,不希望終端退出后關(guān)閉腳本程序,我們可以在的腳本中增加trap命令來忽略SIGHUP信號(掛起進(jìn)程)。
#!/bin/bash trap "" HUP while true;do date >> /root/test.txt sleep 1 done
七、screen
screen命令用于管理多個終端,它可以創(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)后臺的運(yùn)行。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
CentOS環(huán)境下安裝Redis3.0及phpredis擴(kuò)展測試示例
這篇文章主要介紹了CentOS環(huán)境下安裝Redis3.0及phpredis擴(kuò)展測試,結(jié)合實(shí)例形式分析了CentOS下Redis安裝相關(guān)步驟、命令及phpredis擴(kuò)展的測試代碼,需要的朋友可以參考下2018-04-04
Linux上下行網(wǎng)速測試工具_(dá)speedtest-cli安裝使用方法
speedtest-cli是Linux下的一個上下行網(wǎng)速測試工具,是一個用Python寫的命令行腳本,需要的朋友可以參考下2017-03-03
解決Linux+Apache服務(wù)器URL區(qū)分大小寫問題
Linux服務(wù)器的大小寫敏感有時候很不方便,在地址欄里一定要輸入準(zhǔn)確的URL才能訪問,對搜索引擎和用戶不是很友好,那么如何解決LINUX服務(wù)器URL的大小寫問題2020-01-01
詳解Linux系統(tǒng)配置nginx的負(fù)載均衡
這篇文章主要介紹了詳解Linux系統(tǒng)配置nginx的負(fù)載均衡的相關(guān)資料,這里對負(fù)載均衡的幾種方式進(jìn)行了講解并附NGINX配置文件,需要的朋友可以參考下2017-03-03
linux下用戶程序同內(nèi)核通信詳解(netlink機(jī)制)
這篇文章主要介紹了linux下用戶程序同內(nèi)核通信詳解(netlink機(jī)制),涉及netlink,內(nèi)核模塊,用戶程序的介紹等相關(guān)內(nèi)容,小編覺得還是挺不錯的,這里分享給大家,需要的朋友可以參考下2018-01-01
Linux服務(wù)器進(jìn)程退出了,但是顯存占用問題的解決
這篇文章主要介紹了Linux服務(wù)器進(jìn)程退出了,但是顯存占用問題的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09

