終端機關閉時會發送 `SIGHUP` 給子進程,導致前景/背景進程終止。需讓進程**脫離終端機會話**並在後台持續運行。
nohup command > output.log 2>&1 &
# test.sh #!/bin/sh mongod --dbpath="/data/db" & # 關鍵:背景執行 # 腳本結束,但 mongod 仍在運行 # Shell 會將背景子進程「轉交」給 init 進程 (PID 1) 收養
chmod +x test.sh ./test.sh # 此時關閉終端機,mongod 存活
setsid mongod --dbpath="/data/db" # 直接建立新會話,進程組長為自身,PPID 變為 1
command & # 已在背景 disown -h %1 # 將作業 1 標記為忽略 SIGHUP # 或 disown %1 # 從作業表移除,完全脫離 Shell 控制
| 方法 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| nohup & | 臨時命令、簡單腳本 | 簡單、標準 | 需注意終端機關閉方式 |
| 腳本包裝 & | 多命令啟動序列、服務啟動 | 邏輯集中、易維護 | 需額外腳本檔案 |
| setsid | 單一長期運行守護進程 | 徹底脫離、PPID=1 | 較少人知 |
| systemd | 生產環境服務管理 | 標準、依賴管理、日誌、重啟策略 | 需寫 Unit 檔 |
**請直接使用 systemd** 編寫 `.service` 檔,享受開機自啟、失敗重啟、日誌集中、資源限制等企業級特性。上述三法適合開發、測試、臨時任務。
理解 `SIGHUP`、孤兒進程、會話領導者、init 收養機制,才能靈活選擇後台運行策略。開發期用 nohup/setsid,生產期請上 systemd。