Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

Linux 後台運行進程三大法:nohup、腳本托管、setsid 深度解析 Linux 後台運行進程三大法:nohup、腳本托管、setsid 深度解析

編輯:Linux 系統常見問題解答

問題背景

終端機關閉時會發送 `SIGHUP` 給子進程,導致前景/背景進程終止。需讓進程**脫離終端機會話**並在後台持續運行。

方法一:nohup + &(最常用)

nohup command > output.log 2>&1 &
  • `nohup`:忽略 `SIGHUP` 信號。
  • `&`:放入背景執行。
  • 重導向輸出至檔案,避免佔用終端機緩衝區。
  • 缺點:若直接關閉終端機視窗(而非 `exit`),某些 Shell 仍會殺死背景作業。建議先 `exit` 再關視窗。

方法二:腳本包裝 + 托管給 init (PID 1)

# test.sh
#!/bin/sh
mongod --dbpath="/data/db" &   # 關鍵:背景執行
# 腳本結束,但 mongod 仍在運行
# Shell 會將背景子進程「轉交」給 init 進程 (PID 1) 收養
chmod +x test.sh
./test.sh
# 此時關閉終端機,mongod 存活
  • 原理:腳本為父進程,背景子進程在腳本結束後成為孤兒進程,由 init (PID 1) 收養,脫離終端機會話。
  • 驗證:`ps -ef | grep mongod` 看到 PPID=1。

方法三:setsid 直接脫離會話

setsid mongod --dbpath="/data/db"
# 直接建立新會話,進程組長為自身,PPID 變為 1
  • `setsid` 呼叫 `setsid()` 系統調用,建立新會話、新進程組、無控制終端機。
  • 最乾淨、最徹底的脫離方式。
  • 驗證:`ps -ef | grep mongod` PPID=1。

進階:disown 釋放已啟動的背景作業

command &           # 已在背景
disown -h %1        # 將作業 1 標記為忽略 SIGHUP
# 或
disown %1           # 從作業表移除,完全脫離 Shell 控制

對比總結

方法適用場景優點缺點
nohup &臨時命令、簡單腳本簡單、標準需注意終端機關閉方式
腳本包裝 &多命令啟動序列、服務啟動邏輯集中、易維護需額外腳本檔案
setsid單一長期運行守護進程徹底脫離、PPID=1較少人知
systemd生產環境服務管理標準、依賴管理、日誌、重啟策略需寫 Unit 檔

生產環境建議

**請直接使用 systemd** 編寫 `.service` 檔,享受開機自啟、失敗重啟、日誌集中、資源限制等企業級特性。上述三法適合開發、測試、臨時任務。

結語

理解 `SIGHUP`、孤兒進程、會話領導者、init 收養機制,才能靈活選擇後台運行策略。開發期用 nohup/setsid,生產期請上 systemd。

Copyright © Windows教程網 All Rights Reserved