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