在linux中,大多數程式都是以命令列方式啟動的(感覺有點廢話)。預設情況下,程式是會一直在當前終端中執行,並將輸入和輸出都連線到當前開啟的終端。實際使用時,即使當前終端斷開,也需要程序能夠一直執行,本文羅列一下可以讓程序持續執行的幾種方式。
大部分採用rpm、deb等發行的安裝包,預設都提供此種方式。而且通常情況下當程式安裝完成後,會自動註冊到系統的服務列表(通常是在/etc/init.d/
目錄建立軟連線);當然也可以自己根據當前系統手動建立對應的檔案來實現服務的註冊(例如centos7+的systemctl
方式)。
最經典的搭配即為如下方式:
nohup &
不過此種情況下,所有的控制台輸出預設都會被儲存到nohup.out檔案中,因此經常造成此檔案巨大無比,所以實際使用時,經常是使用此種方式:
nohup >/dev/null 2>&1 &
這裡有個小插曲,因為很久沒有研究後台執行這塊了,我一直以為單純的使用&
就可以讓程序在脫離當前會話終端長期執行,經過實踐後發現並不是;而我實際一直使用的僅僅新增&
就能讓程序在後台執行的方式其實是下面這種方式
新建乙個run.sh
檔案,然後在其中寫入如下內容:
&
然後chmod +x run.sh
為其新增可執行許可權,之後./run.sh
來執行這個指令碼,此時程序雖然會輸出到當前終端會話,但其實程序已經脫離了當前會話,此時你可以安全的推出會話,程序也不會退出。
此方式實為開啟了乙個偽終端,程序是在偽終端中執行的,程序是通過偽終端掛載在1號程序上的
此方式實為設定啟動後的程序的父程序為1號程序來實現的:
setsid command
tmux和screen及其類似,都是使用偽終端的方式,目標程序都是掛載在偽終端中的
寫在最後:前兩天偶然想起以前的乙個痛點問題,就是如果某個程序通過指令碼(run.sh
方式啟動)或者nohup &
方式啟動,當終端退出後如何重新檢視程序的控制台輸出;網上找了一通,答案都是大寫的no,不過皇天不負有心人,最後在某個犄角旮旯的角落找到了乙個還能湊合使用的方案reptyr
。此命令肯定是要安裝的,安裝完後就可以使用此命令檢視目標程序的控制台輸出了,但重新接入後是無法退出的,如果按下ctrl + c
會終止目標程序;如果按下ctrl + z
,好吧,按下這個什麼反應也沒有,唯一的退出方式就是右上角關閉當前終端視窗。
完。
Linux中如何讓程序在後台執行
在linux中,如果要讓程序在後台執行,一般情況下,我們在命令後面加上 即可,實際上,這樣是將命令放入到乙個作業佇列中了 test.sh 1 17208 jobs l 1 17208 running test.sh 對於已經在前台執行的命令,也可以重新放到後台執行,首先按ctrl z暫停已經執行的程...
Linux中如何讓程序在後台執行
在linux中,如果要讓程序在後台執行,一般情況下,我們在命令後面加上 即可,實際上,這樣是將命令放入到乙個作業佇列中了 test.sh 1 17208 jobs l 1 17208 running test.sh 對於已經在前台執行的命令,也可以重新放到後台執行,首先按ctrl z暫停已經執行的程...
Linux中如何讓程序在後台執行
一.nohup setsid 使用場景 如果只是臨時有乙個命令需要長時間執行,什麼方法能最簡便的保證它在後台穩定執行呢?我們的解決辦法就有兩種途徑 要麼讓程序忽略 hup 訊號,要麼讓程序執行在新的會話裡從而成為不屬於此終端的子程序。解決方法 1.nohup 只需在要處理的命令前加上 nohup 即...