## 📌 核心知識
在 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`)*