如何透過 ssh 啟動長時間運行的後台進程並立即斷開連接?

如何透過 ssh 啟動長時間運行的後台進程並立即斷開連接?

我想編寫一個 bash 腳本,它可以 ssh 進入伺服器,啟動連續的後台進程(無限的 python 腳本)並退出伺服器。這是我嘗試過的:

ssh user@domain "python3 script.py &"

ssh user@domain "python3 script.py & exit"

ssh user@domain "nohup python3 script.py & exit"

他們都沒有工作。該腳本成功啟動,但我無法退出伺服器並且它保持登入狀態。

答案1

nohup命令沒有按照您的想法進行操作 - 它忽略掛斷訊號,以便可以在終端驅動程式不發送SIGHUP到附加進程的情況下刪除 STDIO 上的(終端)連接,但nohup不會關閉自己的STDIO 連接,並且它在effect 將它們傳遞給它啟動的進程,因此sshd將等待直到進程終止並且這些描述符因此被關閉。

因此,您需要確保您啟動的進程也沒有連接到由sshd(STDIN 已在 上開啟/dev/null)為其提供的 STDOUT 和 STDERR 描述符,並且您可以透過將它們重新導向(到檔案或到/dev/null)來做到這一點。該nohup命令並不是嚴格需要的,因為SIGHUP當 SSH 連線斷開時不會發送任何內容。

嘗試這個:

ssh user@domain "python3 script >/dev/null 2>&1 &"

答案2

嘗試終端多路復用器,tmux 很棒。我通常不喜歡在您可能需要安裝某些東西的地方提供建議,但 tmux 是一個非常方便的應用程序,可以放在您的工具帶中。 (可能已經安裝)

您可以關閉包含在 tmux 中的應用程序,分離關閉您的筆記型電腦,轉到其他地方重新登入並重新附加到仍在 tmux 中運行的會話。如果您的作業系統較舊,螢幕也會類似,但我更喜歡 tmux。

您可以從命令列啟動新應用程式或像這樣格式化的應用程式

tmux 新會話“command1”

tmux new-session "ping 8.8.8.8"

但您可能應該為您的會話命名。現在簡寫一個名為 muxping 的新會話,該會話在背景啟動。 -d 是分離的。

tmux new -d -s muxping "ping 8.8.8.8"

現在在後台顯示它

tmux ls

附加到它

tmux a

此外,您還可以在 tmux 中分割畫面並執行許多非常方便的操作。有許多網站都有 tmux 備忘單,可以簡化大型手冊頁。上手非常容易。

相關內容