如何在 Linux 中使用 nohup 命令

如何在 Linux 中使用 nohup 命令

Linux 命令nohup允許重要進程繼續運行,即使啟動它們的終端窗口已關閉。我們將向您展示如何在現代 Linux 上使用這個古老的命令。

HUP 和 SIGHUP

Linux 的祖先 Unix 是在 PC 發明之前創建的。計算機是大型且昂貴的設備。人們通過串行線路與他們進行交互,無論是在同一建築物內本地還是通過慢速調製解調器連接進行遠程交互。最初,他們將指令打印在電傳打字機上,後來逐漸被鈍終端取代。

他們被稱為啞巴,因為處理能力在你連接的計算機上,而不是在你打字的終端上。程序在計算機上運行——無論它在哪裡——而不是在你辦公桌上的設備上。

如果發生的事情中斷了您的終端和計算機之間的連接,計算機會檢測到換行符並向HUP您正在運行的程序發送或掛斷信號。程序在收到信號時停止執行。

這個功能在今天的 Linux 中仍然存在。PC 上的終端​​窗口是物理終端的模擬。如果您正在運行從該終端窗口啟動的進程並關閉該窗口,SIGHUP則會向程序發送一個信號,以便通知它們HUP並知道它們應該退出。

有級聯效應。如果進程啟動了任何子進程,SIGHUP 也會向下傳遞給它們,以便它們知道應該退出。

該命令nohup啟動子進程,但拒絕向SIGHUP它們發出信號。這可能看起來像一個問題,但它實際上是一個有用的功能。

noup 命令

如果您希望進程在啟動它的終端窗口關閉的情況下繼續運行,您需要一種方法來捕獲它,SIGHUP以便程序永遠不會得到它。(終端窗口實際上並不啟動進程,它們是由終端窗口內的 shell 會話啟動的。)解決這個問題的一個簡單而優雅的方法是在 shell 會話和程序之間放置另一個進程,並擁有中間件程序從不SIGHUP發出信號。

這就是nohup它的作用。它為您運行程序作為子進程nohup,而不是 shell 子進程。由於它們不是 shell 的子進程,因此它們不會直接SIGHUP從 shell 接收。如果nohup他不將SIGHUP它傳遞給他的孩子,那麼程序將根本不會收到它SIGHUP

例如,當您有一個冗長的過程需要在完成之前運行時,這很有用。如果您不小心關閉了終端窗口及其外殼,您也將結束該過程。用於啟動進程將nohup進程與nohup信號隔離開來。如果您正在通過 SSH 在計算機上遠程工作,並且不希望在遠程連接失敗時結束重要進程,則應在擴展名為 的遠程計算機上啟動該進程nohup

使用 nohup

我們創建了一個程序,它不會做任何有用的事情,但它會運行並運行直到完成。它每三秒在終端窗口中打印一次時間。這被稱為long-proc“漫長的過程”。

./long-proc

如果它是一個有用的程序,並且我們希望它在終端窗口和 shell 關閉的情況下繼續運行,我們將使用nohup.

nohup. /long-proc

該進程與它分離stdinstdout 因此它既不能接收任何數據,也不能寫入終端窗口。此外,由於它仍在運行,因此您不會返回到命令提示符。需要nohup做的就是使進程免受關閉終端的影響。它不會將進程變成後台任務。

您現在是否需要重新啟動才能完成該過程?不。要停止nohup您尚未作為後台進程啟動的進程,請按組合鍵 Ctrl+C。

該程序的輸出已為我們編寫在一個名為“nohup.out”的文件中。我們可以以較低的成本查看它。

less nohup.out

通常發送到終端窗口的所有內容都被捕獲在一個文件中。後續nohup運行將附加到現有的“nohup.out”文件。

啟動進程的一種更有用的方法是以nohup能夠承受關閉終端窗口的方式啟動它,同時使其成為後台任務。為此,我們&在命令行末尾添加一個與號“”。

nohup. /long-proc &

您需要再次按“Enter”以返回命令行。我們被告知進程作業號是 1(括號“ []”中的數字),進程 ID 是 13115。

我們可以使用它們中的任何一個來完成該過程。“Ctrl+C”現在不起作用,因為程序與終端窗口或外殼都沒有連接。

如果您忘記了作業編號,可以使用jobs該命令列出從此終端窗口運行的後台任務。

jobs

要終止我們的任務,我們可以使用kill命令和任務編號,前面加上百分號“ %”,如下所示:

kill %1

如果您關閉了終端窗口,則需要找到進程 ID 並將其與kill命令一起使用。該命令pgrep將查找與您輸入的搜索鍵匹配的進程的進程 ID。我們將尋找進程名稱。

pgrep long-proc

現在我們可以使用進程 ID 來結束進程。

kill 13115

下次您按“Enter”時,您將被告知該過程已完成。

現在讓我們看看什麼不會終止進程。我們將重新啟動它,然後關閉終端窗口。

nohup. /long-proc

如果我們打開一個新的終端窗口並使用 找到我們的進程pgrep,我們可以看到它仍在運行。關閉啟動進程的終端窗口沒有任何效果。

pgrep long-proc

您可以將多個命令傳遞給nohup,但通常最好單獨運行它們。這使得將它們作為後台作業進行操作變得更加容易。這些命令不會同時執行,它們將一個接一個地執行。執行不是並行的,而是順序的。為了讓它們同時工作,您需要分別運行它們。

話雖如此,要同時運行多個進程,請使用nohupBash shell 啟動並-c在命令行中使用 (commands) 選項。使用單引號“ '”將命令列表括起來,並使用雙與號“ &&”分隔命令。

nohup bash -c 'ls /bin && ls /sbin'

如果less查看“nohup.out”文件,您將看到第一個進程的輸出,然後是第二個進程的輸出。

less nohup.out

兩個命令的輸出都被捕獲在“nohup.out”文件中。這不是相互交織的,第二個過程的輸出僅在第一個過程完成後才開始。

如果您想使用您自己的文件而不是“nohup.out”,您可以將命令重定向到您選擇的文件。

nohup bash -c 'ls /bin && ls /sbin' > myfile.txt

請注意,消息不再顯示“將輸出添加到 nohupo.out”,而是“將 stderr 重定向到 stdout”,我們將 stdout 重定向到“myfile.txt”文件。

我們可以毫不費力地查看“myfile.txt”文件。

less myfile.txt

和以前一樣,它包含兩個命令的輸出。

有趣的是,實用程序的歷史有時給人的印像是它與現在無關。團隊nohup就是其中之一。為處理串行換行符而創建的東西對於今天在極其強大的機器上的 Linux 用戶仍然有用。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *