當(dāng)前位置 主頁(yè) > 技術(shù)大全 >
`nohup`(實(shí)際上是`nohup`命令的誤寫,正確命令為`nohup`或更常見的`nohup`的簡(jiǎn)化使用方式通過`&`符號(hào)與`disown`命令組合,但本文為便于討論,統(tǒng)一采用廣泛認(rèn)知的`nohup`這一表述,實(shí)際執(zhí)行時(shí)應(yīng)使用`nohup`)作為一個(gè)強(qiáng)大的工具,允許用戶即使在注銷或關(guān)閉終端后,也能持續(xù)運(yùn)行進(jìn)程
本文將深入探討`nohup`命令的原理、使用方法、高級(jí)技巧以及在實(shí)際場(chǎng)景中的應(yīng)用,幫助讀者掌握這一Linux下持久化運(yùn)行進(jìn)程的藝術(shù)
一、`nohup`命令簡(jiǎn)介 `nohup`(No Hang UP的縮寫),字面意思是“不掛斷”,它設(shè)計(jì)用來在用戶退出或終端關(guān)閉后,繼續(xù)運(yùn)行相應(yīng)的命令或腳本
這通過重定向標(biāo)準(zhǔn)輸入、輸出和錯(cuò)誤輸出到非終端文件(通常是`nohup.out`)來實(shí)現(xiàn),從而確保進(jìn)程不會(huì)因?yàn)槭ソK端連接而終止
`nohup`命令的基本語法如下: nohupcommand 【arg...】 & - `command` 是你想要后臺(tái)運(yùn)行的命令或腳本
- `【arg...】` 是傳遞給該命令的參數(shù)
- `&` 符號(hào)將命令置于后臺(tái)執(zhí)行
執(zhí)行上述命令后,`nohup`會(huì)自動(dòng)將輸出重定向到`nohup.out`文件中,除非另有指定
同時(shí),它還會(huì)在當(dāng)前目錄下創(chuàng)建一個(gè)名為`nohup.out`的文件(如果文件已存在,則會(huì)追加內(nèi)容),用于存儲(chǔ)所有輸出信息,包括標(biāo)準(zhǔn)輸出和錯(cuò)誤輸出
二、`nohup`命令的詳細(xì)使用 2.1 基本使用 假設(shè)你想在后臺(tái)運(yùn)行一個(gè)Python腳本`my_script.py`,即使關(guān)閉終端也不影響其執(zhí)行,可以使用以下命令: nohup python3my_script.py & 執(zhí)行后,你會(huì)看到類似以下的輸出: 【1】12345 nohup: ignoring input and appending output to nohup.out 這里的`【1】12345`是作業(yè)號(hào)和進(jìn)程ID,`nohup.out`是默認(rèn)的輸出文件
2.2 自定義輸出文件 如果不希望使用默認(rèn)的`nohup.out`文件,可以通過重定向符號(hào)``來自定義輸出文件: nohup python3my_script.py >my_output.log 2>&1 & 這里`2>&1`表示將標(biāo)準(zhǔn)錯(cuò)誤(文件描述符2)重定向到標(biāo)準(zhǔn)輸出(文件描述符1),這樣所有輸出都會(huì)被寫入`my_output.log`文件
2.3 檢查運(yùn)行中的`nohup`進(jìn)程 要查看當(dāng)前由`nohup`啟動(dòng)的所有進(jìn)程,可以使用`ps`命令結(jié)合`grep`進(jìn)行過濾: ps aux | grep nohup 或者,更精確地,查找與特定命令相關(guān)的進(jìn)程: ps aux | grep python3 my_script.py 2.4 終止`nohup`進(jìn)程 要終止一個(gè)`nohup`進(jìn)程,首先需要找到它的進(jìn)程ID(PID),然后使用`kill`命令
例如: kill 12345 如果進(jìn)程沒有響應(yīng),可以使用`-9`選項(xiàng)強(qiáng)制終止: kill -9 12345 三、`nohup`的高級(jí)應(yīng)用 3.1 與`&`和`disown`的組合使用 雖然`nohup`本身已經(jīng)足夠強(qiáng)大,但在某些情況下,結(jié)合`&`(后臺(tái)執(zhí)行)和`disown`(從shell的作業(yè)控制中移除)命令可以提供更靈活的解決方案
例如: (python3 my_script.py) & disown 這種方式不會(huì)創(chuàng)建`nohup.out`文件,但同樣能讓進(jìn)程在終端關(guān)閉后繼續(xù)運(yùn)行
需要注意的是,這種方式不會(huì)自動(dòng)處理輸出重定向,因此可能需要手動(dòng)指定
3.2 自動(dòng)化腳本中的`nohup` 在自動(dòng)化腳本中,`nohup`常用于啟動(dòng)長(zhǎng)時(shí)間運(yùn)行的服務(wù)或任務(wù)
例如,在啟動(dòng)一個(gè)Web服務(wù)器時(shí),可以這樣做: !/bin/bash nohup python3 -m http.server 8000 & echo Web server started in the background. 這個(gè)腳本將啟動(dòng)一個(gè)簡(jiǎn)單的HTTP服務(wù)器,監(jiān)聽8000端口,并且即使腳本執(zhí)行完畢,服務(wù)器也會(huì)繼續(xù)運(yùn)行
3.3 使用`screen`或`tmux`作為替代方案 雖然`nohup`非常強(qiáng)大,但在某些情況下,使用像`screen`或`tmux`這樣的終端復(fù)用器可能更加靈活
這些工具允許用戶創(chuàng)建多個(gè)會(huì)話,每個(gè)會(huì)話可以有自己的窗口和進(jìn)程,即使斷開連接,這些會(huì)話和進(jìn)程也會(huì)保持活躍
用戶可以隨時(shí)重新連接到這些會(huì)話,繼續(xù)操作或查看輸出
啟動(dòng)一個(gè)新的screen會(huì)話 screen -S mysession 在screen會(huì)話中運(yùn)行命令 python3my_script.py 分離screen會(huì)話(但不會(huì)終止進(jìn)程) Ctrl-a, 然后按 d 重新連接到screen會(huì)話 screen -r mysession 四、`nohup`在實(shí)際場(chǎng)景中的應(yīng)用案例 - Web服務(wù)器和后臺(tái)服務(wù):在開發(fā)環(huán)境中,經(jīng)常需要啟動(dòng)Web服務(wù)器、數(shù)據(jù)庫(kù)服務(wù)等后臺(tái)進(jìn)程,`nohup`可以確保這些服務(wù)在開發(fā)者注銷后繼續(xù)運(yùn)行
- 批量處理和長(zhǎng)時(shí)間任務(wù):對(duì)于需要長(zhǎng)時(shí)間運(yùn)行的數(shù)據(jù)處理任務(wù),如批量文件轉(zhuǎn)換、大數(shù)據(jù)分析等,`nohup`可以確保任