讓我們一起來探索 Linux 作業系統中的一個神秘世界——後台運行。在日常的使用中,我們經常需要使用後台運行來讓任務在後台默默地執行,而不會影響我們目前的工作。那麼,在 Linux 中,如何實現後台運行呢?
思考
首先要考慮一個問題,直接關閉終端為什麼後台程式就退出了?那是因為直接關閉,終端會向當前環境啟動的後台任務發送SIGHUP信號,讓運行的程序就掛起,那麼忽略SIGHUP就行啦。
nohup
#最常用的指令就是【nohup】,從名字就看出是否掛起運作指令,關閉終端機或退出某個帳號,行程也繼續保持運作狀態,同樣要配合【&】符號一起使用。
用法:nohup Command [ Arg … ] [ & ]
$ 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
setsid和nohup還有一個差別是,不需要使用&後台符號。
exit
使用exit指令退出終端,我們的程式還是會繼續運行,這是為什麼呢?
這是因為使用exit指令退出終端機時不會向終端機所屬任務發送SIGHUP訊號,是huponexit 設定項控制的,預設是off,可以使用shopt 指令查看。
[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內建的指令,接收到指定訊號時將要採取的行動,後是要處理的訊號名,常見的訊號如下:
當一個腳本要後台,同樣不希望終端退出而關閉程序,我們可以在的腳本中增加trap命令,來忽略SIGHUP信號(掛起進程)。
#!/bin/sh trap "" HUP while true;do date >> /root/test.txt sleep 1 done
Linux screen指令用於多重視窗管理程序,它可以建立一個終端,讓程式在裡面運行
screen sh test.sh &
從範例可以看出,test腳本的父進程是screen終端進程,而screen終端的父進程PID1,同樣完成了後台進程的運作。
總之,在 Linux 中,後台運行是一種非常常見且實用的技巧。無論是在伺服器端進行一些後台服務,還是在個人電腦上完成一些長時間運行的任務,後台運行都可以幫助我們提高效率,便捷我們的日常工作。
以上是探秘 Linux 中的神秘後台運行世界的詳細內容。更多資訊請關注PHP中文網其他相關文章!