Bash?中?nohup?與?&?的區(qū)別及用法詳解
在 Bash 中,nohup
和 &
都可以用來在后臺(tái)運(yùn)行命令,但它們的作用和用途各有不同。以下將詳細(xì)介紹它們的特點(diǎn)、區(qū)別及適用場(chǎng)景。
1. &(后臺(tái)運(yùn)行)
&
是 Bash 的一個(gè)特殊符號(hào),用于將命令放到后臺(tái)執(zhí)行。它的主要功能是讓命令在后臺(tái)運(yùn)行,不會(huì)阻塞當(dāng)前終端。
- 特點(diǎn): 后臺(tái)執(zhí)行:命令會(huì)在后臺(tái)運(yùn)行,用戶可以繼續(xù)在當(dāng)前終端執(zhí)行其他操作。
- 依賴終端:盡管命令在后臺(tái)運(yùn)行,但它仍然依賴于當(dāng)前終端。如果終端關(guān)閉(例如 SSH 連接斷開),該后臺(tái)進(jìn)程可能會(huì)被終止。
- 輸出到終端:命令的標(biāo)準(zhǔn)輸出和錯(cuò)誤輸出仍然發(fā)送到當(dāng)前終端,可能導(dǎo)致屏幕混亂。
示例:
./long_running_script.sh &
上述命令會(huì)將腳本放到后臺(tái)運(yùn)行。但如果終端關(guān)閉(如斷開 SSH 連接),腳本可能會(huì)被終止。
2. nohup(忽略掛起信號(hào))
nohup
是一個(gè)命令,用于讓進(jìn)程忽略掛起信號(hào)(SIGHUP
),從而確保進(jìn)程在終端關(guān)閉后仍然能夠繼續(xù)運(yùn)行。nohup
的名稱來源于 “no hang up”(不掛起)。
- 特點(diǎn): 忽略掛起信號(hào):即使終端關(guān)閉,進(jìn)程也不會(huì)被終止。
- 默認(rèn)輸出:如果未明確指定輸出文件,
nohup
會(huì)將標(biāo)準(zhǔn)輸出和錯(cuò)誤輸出重定向到文件nohup.out
。 - 不一定后臺(tái)運(yùn)行:
nohup
本身不會(huì)將命令放到后臺(tái)運(yùn)行,但可以與&
結(jié)合使用實(shí)現(xiàn)后臺(tái)運(yùn)行。
示例:
nohup ./long_running_script.sh &
上述命令會(huì)確保腳本即使在終端關(guān)閉后也能繼續(xù)運(yùn)行,且輸出默認(rèn)會(huì)被重定向到 nohup.out
文件。
3. disown(取消作業(yè)控制)
disown
是一個(gè)用于從當(dāng)前終端的作業(yè)控制中移除后臺(tái)進(jìn)程的命令。它通常與 &
配合使用,確保進(jìn)程在終端關(guān)閉后繼續(xù)運(yùn)行。
特點(diǎn):
- 通過
disown
,后臺(tái)進(jìn)程將不再受當(dāng)前終端的控制。 - 一旦移除,終端關(guān)閉對(duì)該進(jìn)程不會(huì)產(chǎn)生影響。
示例:
./long_running_script.sh & disown
上述命令先將腳本放到后臺(tái)運(yùn)行,然后通過 disown
將其從作業(yè)控制中移除,確保終端關(guān)閉后腳本繼續(xù)運(yùn)行。
區(qū)別對(duì)比
功能 | & | nohup | disown |
---|---|---|---|
后臺(tái)運(yùn)行 | 是 | 可結(jié)合 & 實(shí)現(xiàn) | 通常與 & 配合使用 |
是否依賴終端 | 是(終端關(guān)閉會(huì)終止) | 否(忽略掛起信號(hào)) | 否(取消作業(yè)控制) |
輸出重定向 | 否(默認(rèn)輸出到終端) | 默認(rèn)重定向到 nohup.out (可更改) | 不影響輸出 |
常用場(chǎng)景 | 簡(jiǎn)單的后臺(tái)任務(wù) | 長(zhǎng)時(shí)間運(yùn)行且需保持運(yùn)行的任務(wù) | 已啟動(dòng)的后臺(tái)任務(wù)需要保持運(yùn)行 |
推薦用法
在實(shí)際場(chǎng)景中,如果希望命令在后臺(tái)運(yùn)行且在終端關(guān)閉后繼續(xù)執(zhí)行,可以結(jié)合使用以下命令:
nohup ./long_running_script.sh > output.log 2>&1 &
解釋:
nohup
:確保進(jìn)程不會(huì)因終端關(guān)閉而被終止。> output.log
:將標(biāo)準(zhǔn)輸出重定向到output.log
文件。2>&1
:將錯(cuò)誤輸出也重定向到相同的文件。&
:將命令放到后臺(tái)運(yùn)行。
通過上述組合,可以安全地運(yùn)行后臺(tái)任務(wù),并將輸出記錄到指定文件中,便于后續(xù)分析。
總結(jié)
&
:適合不依賴終端關(guān)閉的簡(jiǎn)單后臺(tái)任務(wù)。nohup
:用于長(zhǎng)時(shí)間運(yùn)行的任務(wù),避免受終端關(guān)閉影響。disown
:對(duì)已經(jīng)在后臺(tái)運(yùn)行的任務(wù)提供額外的安全性,確保其不受終端控制。
選擇適合的工具和組合方式,可以高效完成任務(wù),同時(shí)保證系統(tǒng)的穩(wěn)定性和可操作性。
到此這篇關(guān)于Bash 中 nohup 與 & 的區(qū)別及用法詳解的文章就介紹到這了,更多相關(guān)Bash nohup 與 & 區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Shell腳本中使用for循環(huán)和cat命令實(shí)現(xiàn)按順序合并文件
這篇文章主要介紹了Shell腳本中使用for循環(huán)和cat命令實(shí)現(xiàn)按順序合并文件,本文先是用sed命令來實(shí)現(xiàn),發(fā)現(xiàn)不能完成需求,后使用for循環(huán)解決,需要的朋友可以參考下2015-01-01linux下shell腳本備份文件的方法實(shí)現(xiàn)
本文主要介紹了linux下shell腳本備份文件的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08