快轉到主要內容
  1. 文章/

SSH 教學:SSH 遠端不中斷跑程式

··
技術 SSH
Toast
作者
Toast
Toast 是一位分享知識、生活和其他的部落客。他也是台灣的一名學生。

前言
#

相信經常使用 SSH 連線遠端 server 工作的人經常碰到一件事,就是如果在 server 上跑一些用時較長的程式(例如模型訓練)時,遇到 SSH 斷線或登出後,程式就會被迫中止,之後又得再重跑一次,這對我們來說是非常麻煩的。

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

方法一:nohup
#

斷線後不中斷
#

每當我們 SSH 斷線時,SSH 都會收到掛斷訊號(HUP),這會使我們還在上面跑的程式被迫停止。使用 nohup 可以讓 SSH server 忽略 HUP 指令繼續運行,以下以 python 腳本為例:

nohup python your_script.py > output.log 2>&1 &
  • nohup:忽略掛斷訊號(HUP)
  • > output.log 2>&1:將 stdout 和 stderr 重導到檔案
  • &:讓程式在背景執行

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

如何終止程式
#

如果我們想中斷程式運行的話,我們可以使用 kill 指令:

kill -9 PID

PID 是該 process 的編號,可以透過 ps 來尋找:

ps -aux | grep your_script.py

方法二:tmux
#

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

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

輸入下方指令可以建立新的 session,然後直接在 session 中執行你的程式:

tmux new -s <your_session_name>

若斷線,可以透過以下方式重新回到 session 中。

tmux attach -t <your_session_name>

如果忘記自己當初設的 session name 的話,可以透過下方方式查詢此 server 建立的 session:

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/