前言 #
相信經常使用 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/