nohup (No Hang Up) 讓指令忽略 SIGHUP (掛斷信號),在終端關閉、用戶登出後仍持續運行,輸出自動導向 nohup.out。是長時間任務、服務啟動的必備工具。
nohup command [arg...] &
& 讓指令在後台運行 (Shell 作業控制)。./nohup.out,不可寫時寫入 $HOME/nohup.out。# 1. 後台運行 Python 腳本
nohup python3 /path/script.py > /var/log/script.log 2>&1 &
# 2. 後台啟動 Java 應用
nohup java -jar app.jar --server.port=8080 &
# 3. 指定輸出檔案
nohup ./long_task.sh > my_output.log 2>&1 &
# 4. 管道配合
nohup find / -name "*.log" -mtime +30 -delete > /var/log/cleanup.log 2>&1 &
jobs # 查看當前 Shell 後台作業
fg %1 # 將作業 1 調回前台
bg %1 # 讓暫停作業 1 在後台繼續
kill %1 # 終止作業 1
disown -h %1 # 從 Shell 作業表移除,不再接收 SIGHUP (類似 nohup 效果)
| 方式 | 登出後存活 | 輸出管理 | 適用場景 |
|---|---|---|---|
cmd & | 否 (收到 SIGHUP 終止) | 終端 | 短暫前台互動 |
nohup cmd & | 是 | nohup.out / 指定檔 | 臨時長時間任務、腳本 |
disown -h | 是 | 原終端 (若關閉則丟失) | 已啟動前台任務轉後台 |
systemd service | 是 (系統級) | journalctl / 標準輸出 | 生產服務、開機自啟、監控 |
screen/tmux | 是 (會話級) | 虛擬終端緩衝區 | 互動式長時間操作、斷點續傳 |
2>&1 合併 stderr 到 stdout,再導向檔案。>> log.txt 2>&1 避免覆蓋歷史日誌。nohup cmd & echo $! > /var/run/cmd.pid 便後續管理。logrotate 或 rotatelogs。nohup 會自動守護進程重啟 —— **不會**,進程異常退出需外部監控 (systemd, supervisord, Monit)。nohup 能讓已經在前台運行的指令免受影響 —— **需配合 Ctrl+Z 暫停、bg、disown -h**。$HOME/nohup.out。