---
# System prepended metadata

title: SSH 教學：SSH 遠端不中斷跑程式
tags: [技術, SSH]

---

# SSH 教學：SSH 遠端不中斷跑程式  
###### tags：`技術` `SSH`
## 前言  
相信經常使用 SSH 連線遠端 server 工作的人經常碰到一件事，就是如果在 server 上跑一些用時較長的程式（例如模型訓練）時，遇到 SSH 斷線或登出後，程式就會被迫中止，之後又得再重跑一次，這對我們來說是非常麻煩的。  

因此，本文章將教你如何讓程式在 SSH 斷線或登出後依然可以繼續執行。  

## 方法一：nohup  
### 斷線後不中斷
每當我們 SSH 斷線時，SSH 都會收到**掛斷訊號（HUP）**，這會使我們還在上面跑的程式被迫停止。使用 `nohup` 可以讓 SSH server 忽略 HUP 指令繼續運行，以下以 python 腳本為例：  
```shell
nohup python your_script.py > output.log 2>&1 &
```
- `nohup`：忽略掛斷訊號（HUP）
- `> output.log 2>&1`：將 stdout 和 stderr 重導到檔案
- `&`：讓程式在背景執行

透過這種方式，即使我們關閉 SSH 連線或本地電腦，程式仍然可以繼續運行。  

### 如何終止程式  
如果我們想中斷程式運行的話，我們可以使用 `kill` 指令：  

```shell
kill -9 PID
```
`PID` 是該 process 的編號，可以透過 `ps` 來尋找：  

```shell
ps -aux | grep your_script.py
```

## 方法二：tmux  
`tmux` 是一個 Linux 的**終端機管理工具**，具有**分割視窗、同時開啟多個終端機**的功能。其中 `tmux` 有個功能叫做 `session`，我們可以利用將程式放到 `tmux` 創立的 `session` 上跑，`session` 會保存我們程式的運行狀態，即使我們斷線了程式依然繼續執行，除非我們主動把 tmux server 砍掉或把遠端 server 重開機。  

:::warning
這邊暫時不會講到太理論面的東西，之後會再補上或者撰寫新文章。
:::

輸入下方指令可以建立新的 `session`，然後直接在 `session` 中執行你的程式：  
```shell
tmux new -s <your_session_name>
```

若斷線，可以透過以下方式重新回到 `session` 中。  
```shell
tmux attach -t <your_session_name>
```

如果忘記自己當初設的 session name 的話，可以透過下方方式查詢此 server 建立的 session：  
```shell
tmux ls
```

## 總結  
以上兩種都是可以讓程式不會受到 SSH 斷線就停止運作的方法。由於 `tmux session` 可以直接在終端機上面查看輸出，相較於方法一更為方便，因此實務上我們更常使用方法二。  

## 參考資料  
1.keyboy（2022 年 11 月 23 日）。[Linux Note] SSH遠端跑程式登出後不中斷。iT 邦幫忙。https://ithelp.ithome.com.tw/articles/10309065  
2.andyou（2017 年）。什麼是 tmux。https://andyyou.github.io/2017/11/27/tmux-notes/  

