liunx 使程序在後台執行的幾種方法
現在有如下兩個目標:
首先要明白什麼是程序、程序組、會話、終端、作業等名詞。
為什麼程序會被終止
使用者登出或者網路斷開時,sighup 訊號會被傳送到會話所屬的子程序,而 sighup 的預設處理方式是終止收到該訊號的程序。所以若程式中沒有捕捉該訊號,當終端關閉後,會話所屬程序就會退出。
利用 & 符號
將 & 附在命令後面可以使程序在後台執行,不占用前台介面。它實際上是在會話中開啟了乙個後台作業,但是此時如果終端被關閉了,程序還是會退出,這是因為 & 只有讓程序退出前台終端的功能,無法讓程序不受 sighup 的影響。
nohup 命令
nohup 可以使得程序不受 sighup 訊號的影響,但是執行nohup php test.php
後會發現,程序還是會一直占用著前台終端,不過此時如果終端被關閉或連線斷開,程式還是會繼續執行。另外此時當前資料夾還會多出乙個 nohup.out 檔案。
這是因為 nohup 僅僅讓程序不受 sighup 訊號影響,並不會讓出前台,而且它還會在命令執行的目錄下生成 nohup.out 用於儲存程序輸出。如果不需要輸出,且不想建立 nohup.out 檔案,可以將標準輸出和標準錯誤重定向。
我們常將 & 和 nohup 搭配一起使用,執行命令如下:nohup command >/dev/null 2>&1 &
,這樣就可以既不占用前台,又不會受 sighup 訊號影響,同時也不會建立輸出檔案。
setsid 命令
setsid 是另乙個讓程序在後台執行的命令,它的作用是讓程序開啟乙個新的會話並執行程序,使用方式為 setsid command。
前面的做法都是使得程序忽略 sighup 訊號的影響,而 setsid 則乾脆讓程序新開啟乙個會話並在其中執行,那麼原會話終端狀態就不會影響該程序了。不過 setsid 並沒有為程序分配乙個輸出終端,所以程序還是會輸出到當前終端上。
不過 setsid 在 shell 指令碼中表現的會有不同,具體可另行查詢資料。
小結除了上述做法之外,還可以利用 screen ,tmux 等會話工具來實現程序的後台執行,這裡不做介紹。
本文主要解決了如何使程序不受終端和會話的影響,通過忽視 sighub 訊號從而實現在後台執行,上述的每個命令用法可能並不僅僅如此,並沒有展開介紹每個命令的所有用法。同時本文介紹也僅僅是所有方案中的一部分。
使程式在後台執行
背景 啟動了程式後,xshell一直列印程式執行的內容,此時如果ctrl z或ctrl c的話,是會使程式掛起,即不再執行。那怎麼辦?此時強制關閉xshell也不行,程式也會掛起,難道xshell一直開著?那也會有斷線的時候,那如何讓程式在後台執行呢?1 輸入命令 nohup 你的shell命令 2...
Linux小 技巧 讓程序在後台可靠執行的幾種方法
我們經常會碰到這樣的問題,用 telnet ssh 登入了遠端的 linux 伺服器,執行了一些耗時較長的任務,結果卻由於網路的不穩定導致任務中途失敗。如何讓命令提交後不受本地關閉終端視窗 網路斷開連線的干擾呢?下面舉了一些例子,您可以針對不同的場景選擇不同的方式來處理這個問題。nohup sets...
Linux 技巧 讓程序在後台執行更可靠的幾種方法
開始概念之前首先上幾個實戰問答 乙個服務的監測指令碼示例 bin bash export path path usr local bin cmd usr sbin lsof n p i tcp s tcp listen grep 8090 if z cmd then echo down.date p...