Linux程式後臺執行實踐

安全劍客發表於2020-09-15
通常我們在使用 時,會經常要把一個程式放到後臺執行,這時候就需要在程式的最後使用【&】符號,但是當直接關閉這個終端時,程式就會退出,下面我介紹5種方法,在關閉終端後程式還繼續執行。
思考

首先要考慮一個問題,直接關閉終端為什麼後臺程式就退出了?那是因為直接關閉,終端會向當前環境啟動的後臺任務傳送SIGHUP訊號,讓執行的程式就掛起,那麼忽略SIGHUP就行啦。

nohup

最常用的 就是【nohup】,從名字就看出是否掛起執行 ,關閉終端或者退出某個賬號,程式也繼續保持執行狀態,同樣要配合【&】符號一起使用。

用法:nohup Command [ Arg … ] [ & ]

Linux程式後臺執行實踐Linux程式後臺執行實踐

$ nohup sh test.sh &  
# 直接關閉當前終端,再開啟一個檢視  
$ ps -few|grep test.sh

從上面的可以看出,我們執行的test.sh的父程式變成了【PID 1】.,由linux主程式接管。

setsid

nohup是忽略SIGHUP訊號,有沒其他的思路嗎?

setip命令可以重新開啟了會話,繼承了父程式組的ID,脫離了父程式的控制。從下圖可以看到,test.sh 的父程式已經是init 1,此時不管關閉還是退出終端,已經和後臺的程式沒有關係了。

$ setsid sh test.sh

Linux程式後臺執行實踐Linux程式後臺執行實踐

setsid和nohup還有一個區別是,不需要使用&後臺符號。

exit

使用exit命令退出終端,我們的程式還是會繼續執行,這是為什麼呢?

這是因為使用exit命令退出終端時不會向終端所屬任務發SIGHUP訊號,是huponexit 配置項控制的,預設是off,可以使用shopt 命令檢視。

Linux程式後臺執行實踐Linux程式後臺執行實踐

[root@api ~]# shopt |grep huponexit  
huponexit off

將huponexit 配置成on,再次使用exit命令退出,所屬的任務就會跟隨退出。

[root@api ~]# shopt -s huponexit  
[root@api ~]# shopt |grep huponexit  
huponexit on
trap

trap命令linux內建的命令,接收到指定訊號時將要採取的行動,後是要處理的訊號名,常見的訊號如下:

Linux程式後臺執行實踐Linux程式後臺執行實踐

當一個 要後臺,同樣不希望終端退出而關閉程式,我們可以在的指令碼中增加trap命令,來忽略SIGHUP訊號(掛起程式)。

 #!/bin/sh  
trap "" HUP  
while true;do  
date >> /root/test.txt  
sleep 1  
done

Linux screen命令用於多重視窗管理程式,它可以建立一個終端,讓程式在裡面執行

Linux程式後臺執行實踐Linux程式後臺執行實踐

screen sh test.sh &

從示例可以看出,test指令碼的父程式是screen終端程式,而screen終端的父程式PID1,同樣完成了後臺程式的執行。

總結

至此,我們完成了5種linux程式後臺執行的方法,同樣是不需要關心終端是否關閉,你還知道哪些linux後臺執行程式的方法?

原文地址:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2721176/,如需轉載,請註明出處,否則將追究法律責任。

相關文章