nohup

Posted by Adam on August 24, 2022
## 📌 核心知識 在 Linux 中,直接執行 `java -jar app.jar` 時,程式會綁定在當前的 SSH 終端機(TTY/PTS)。當 SSH 斷線時,系統會向該終端機發送 `SIGHUP`(Hangup)訊號,導致背景程式一起結束。 要讓 Java 程式在背景執行且 SSH 斷線後繼續運作,最常用且簡單的方法是使用 **`nohup`** 搭配 **`&`**: ```bash nohup java -jar app.jar > app.log 2>&1 & ``` ### 指令拆解說明 * **`nohup`**:忽略 `SIGHUP` 訊號,防止 SSH 斷線時程式被終止。 * **`java -jar app.jar`**:要執行的 Java 程式指令。 * **`> app.log`**:將標準輸出(stdout)重導向寫入到 `app.log` 檔案。 * **`2>&1`**:將標準錯誤輸出(stderr)也重導向到標準輸出(即寫入同一個 `app.log`)。 * **`&`**:將程式放到背景(Background)執行,讓你可以繼續在終端機輸入其他指令。 --- ## 🔸 類似概念 除了 `nohup` 之外,還有其他常見的方法可以達到相同效果: | 方法 | 指令格式 | 特點與適用場景 | | --- | --- | --- | | **nohup** | `nohup java -jar app.jar &` | **最常用、最簡單**。適合不需要互動的背景服務。 | | **systemd** | 設定 `/etc/systemd/system/myapp.service` | **正式生產環境首選**。支援開機自動啟動、崩潰自動重啟、日誌統一管理。 | | **screen / tmux** | `screen -S myapp` 後執行指令 | **適合開發測試**。建立虛擬終端機,隨時可重新連回去查看即時 Console 輸出。 | | **disown** | 先 `java -jar app.jar &` 再執行 `disown` | **救急用**。程式已經在背景執行但忘記加 `nohup` 時使用。 | --- ## 📝 範例說明 ### 1. 啟動與檢視流程 **步驟 1:執行 Java 程式** ```bash nohup java -jar my-service.jar > my-service.log 2>&1 & ``` 執行後終端機會顯示類似 `[1] 12345` 的 PID(進程識別碼)。 **步驟 2:確認程式是否成功在背景執行** ```bash ps -ef | grep my-service.jar ``` **步驟 3:即時查看執行日誌** ```bash tail -f my-service.log ``` --- ### 2. 停止背景執行的 Java 程式 **步驟 1:找出程式的 PID** ```bash jcmd # 或使用 ps 指令 ps -ef | grep java ``` **步驟 2:優雅關閉程式** ```bash kill 12345 ``` *(請將 `12345` 替換為實際查到的 PID。若程式無回應,才使用強行終止 `kill -9 12345`)*