如何后臺運行一個程序?

????說起如何后臺運行一個程序,相信很多同學都會第一時間想起&。但是&并不是萬能的,這里總結一下后臺運行進程幾種方法。

一、為什么&不能保證一個程序后臺運行?

? ? 1. 首先我們要弄清楚為啥&不能保證一個程序后臺運行,非得加上nohup呢?先做一個測試。

?? ?????如下,通過 ./test.sh &后臺運行一個進程,可以通過 jobs -l 查詢后臺進程的pid。

????? ??然后直接關閉終端窗口,再打開終端,會發(fā)現(xiàn)在后臺運行的test進程消失了。

????????測試說明,光靠&是沒法可靠保證程序后臺運行的。

? ? 2. 為什么關閉終端會導致后臺運行的進程退出呢?

????????內核發(fā)現(xiàn)終端關閉,會給該終端所有的進程(包括前后臺進程)發(fā)送SIGHUP信號。進程受到SIGHUP信號便退出了。

????????PS: 這里所謂終端關閉就是指內核感知不到終端了,例如遠程登錄時的網(wǎng)絡斷開、sshd 掛掉、手動叉掉 ssh 登陸窗口之類的情況也算在內。

二、如何保證進程不會被SIGHUP信號終止?

????1. nohup + &

????????先看一下man中關于nohup的描述:運行一個command,并且免疫 hangup,即免疫SIGHUP信號。

????????但是nohup命令無法使進程后臺運行。所以可以將nohup和&結合起來,實現(xiàn)后臺運行進程,并且免疫SIGHUP信號,這樣保證后臺進程不會被SIGHUP信號終止。如:

? ????? # nohup ./test > /dev/null 2>&1 &

????? ? PS:nohup默認會將輸出重定向到一個nohup.out文件中,可以自己根據(jù)需要進行重定向。

? ? 2. screen

????????Screen是一個用于終端切換到命令。只要Screen本身沒有終止,在其內部運行的會話都可以恢復。這一點對于遠程登錄的用戶特別有用——即使網(wǎng)絡連接中斷,用戶也不會失去對已經打開的命令行會話的控制。只要再次登錄到主機上執(zhí)行screen -r就可以恢復會話的運行。同樣在暫時離開的時候,也可以執(zhí)行分離命令detach,在保證里面的程序正常運行的情況下讓Screen掛起(切換到后臺)。

????? ? man screen如下:

????????通過 screen 命令創(chuàng)建的環(huán)境下運行的終端命令,其父進程不是 sshd 登錄會話,而是 screen。這樣就可以即避免用戶退出進程消失的問題,又隨時能重新接管回終端繼續(xù)操作。

? ? ????使用方法:

# screen -dmS screen_test? ? ? ? ? ?//創(chuàng)建一個screen

# screen -list? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//查看系統(tǒng)中已存在的screen

# screen -r screen_test? ? ? ? ? ? ? ? //連接某個screen

Ctrl+A+D 鍵? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //從當前screen中離開

? ? 3. service 或 systemctl

????????將進程的啟動加入到系統(tǒng)服務中,如service或者sysctmctl。

? ? 4.?daemontools

????????使用daemontools第三方工具實現(xiàn)后臺運行管理,如supervisord。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容