Linux運維之,關(guān)閉終端,程序后臺運行,我有5種方法你呢?
前言
我們在使用linux時,會經(jīng)常要把一個程序放到后臺運行,這時候就需要在程序的最后使用【&】符號,但是當直接關(guān)閉這個終端時,程序就會退出,下面我介紹5種方法,在關(guān)閉終端后程序還繼續(xù)運行。
思考
首先要考慮一個問題,直接關(guān)閉終端為什么后臺程序就退出了?那是因為直接關(guān)閉,終端會向當前環(huán)境啟動的后臺任務(wù)發(fā)送SIGHUP信號,讓運行的程序就掛起,那么忽略SIGHUP就行啦。
nohup
最常用的命令就是【nohup】,從名字就看出是否掛起運行命令,關(guān)閉終端或者退出某個賬號,進程也繼續(xù)保持運行狀態(tài),同樣要配合【&】符號一起使用。
用法:nohup Command [ Arg … ] [ & ]
- $ nohup sh test.sh &
- # 直接關(guān)閉當前終端,再打開一個查看
- $ ps -few|grep test.sh
從上面的可以看出,我們運行的test.sh的父進程變成了【PID 1】.,由linux主進程接管。
setsid
nohup是忽略SIGHUP信號,有沒其他的思路嗎?
setip命令可以重新打開了會話,繼承了父進程組的ID,脫離了父進程的控制。從下圖可以看到,test.sh腳本的父進程已經(jīng)是init 1,此時不管關(guān)閉還是退出終端,已經(jīng)和后臺的程序沒有關(guān)系了。
- $ setsid sh test.sh
setsid和nohup還有一個區(qū)別是,不需要使用&后臺符號。
exit
使用exit命令退出終端,我們的程序還是會繼續(xù)運行,這是為什么呢?
這是因為使用exit命令退出終端時不會向終端所屬任務(wù)發(fā)SIGHUP信號,是huponexit 配置項控制的,默認是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)置的命令,接收到指定信號時將要采取的行動,后是要處理的信號名,常見的信號如下:
當一個腳本要后臺,同樣不希望終端退出而關(guān)閉程序,我們可以在的腳本中增加trap命令,來忽略SIGHUP信號(掛起進程)。
- #!/bin/sh
- trap "" HUP
- while true;do
- date >> /root/test.txt
- sleep 1
- done
Linux screen命令用于多重視窗管理程序,它可以創(chuàng)建一個終端,讓程序在里面運行
- screen sh test.sh &
從示例可以看出,test腳本的父進程是screen終端進程,而screen終端的父進程PID1,同樣完成了后臺進程的運行。
總結(jié)
至此,我們完成了5種linux程序后臺運行的方法,同樣是不需要關(guān)心終端是否關(guān)閉,你還知道哪些linux后臺運行程序的方法?