Linux運(yùn)維之,關(guān)閉終端,程序后臺(tái)運(yùn)行,我有5種方法你呢?
前言
我們?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è)問題,直接關(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就行啦。
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)前終端,再打開一個(gè)查看
- $ ps -few|grep test.sh
從上面的可以看出,我們運(yùn)行的test.sh的父進(jìn)程變成了【PID 1】.,由linux主進(jìn)程接管。
setsid
nohup是忽略SIGHUP信號(hào),有沒其他的思路嗎?
setip命令可以重新打開了會(huì)話,繼承了父進(jìn)程組的ID,脫離了父進(jìn)程的控制。從下圖可以看到,test.sh腳本的父進(jìn)程已經(jīng)是init 1,此時(shí)不管關(guān)閉還是退出終端,已經(jīng)和后臺(tái)的程序沒有關(guān)系了。
- $ setsid sh test.sh
setsid和nohup還有一個(gè)區(qū)別是,不需要使用&后臺(tái)符號(hào)。
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)置的命令,接收到指定信號(hào)時(shí)將要采取的行動(dòng),后是要處理的信號(hào)名,常見的信號(hào)如下:
當(dāng)一個(gè)腳本要后臺(tái),同樣不希望終端退出而關(guān)閉程序,我們可以在的腳本中增加trap命令,來忽略SIGHUP信號(hào)(掛起進(jìn)程)。
- #!/bin/sh
- trap "" HUP
- while true;do
- date >> /root/test.txt
- sleep 1
- done
Linux screen命令用于多重視窗管理程序,它可以創(chuàng)建一個(gè)終端,讓程序在里面運(yùn)行
- screen sh test.sh &
從示例可以看出,test腳本的父進(jìn)程是screen終端進(jìn)程,而screen終端的父進(jìn)程PID1,同樣完成了后臺(tái)進(jìn)程的運(yùn)行。
總結(jié)
至此,我們完成了5種linux程序后臺(tái)運(yùn)行的方法,同樣是不需要關(guān)心終端是否關(guān)閉,你還知道哪些linux后臺(tái)運(yùn)行程序的方法?