當 ssh 死亡時終止由 ssh 產生的程序
這是一個已經多次解決的問題,不僅在這裡,而且在堆棧交換網路的其他站點(例如,當我中斷 ssh 自身時,如何使 ssh 殺死遠端程序?)。但是,我無法讓任何解決方案對我有用。
我正在通過 ssh 執行命令。每當我退出 ssh 時,我都希望該命令也終止。這個命令是一個名為 ktserver 的守護程序,它會無限期地執行,直到您按下 Ctrl-C。
我按如下方式執行它:
ssh -t compute-0-1 ktserver
事實上,當我按下 Ctrl-C 時,該過程優雅地結束並且 ssh 會話結束。但是,如果我沒有按 Ctrl-C,而是使用
kill
命令終止 ssh 程序(例如,發送 SIGINT 或 SIGHUP),則該ktserver
程序保持活動狀態。我怎樣才能讓
ktserver
總是死獨立於如何ssh
被殺死?編輯:如果不是
ktserver
我執行一些完全不同的東西,例如gedit
,一切都像一個魅力(即當連接斷開時 gedit 死亡)。因此,過程本身可能有問題。例如,我認為它可能忽略了 SIGHUP 或 SIGINT。但是,當我執行kill -1 ktserver
or時kill -2 ktserver
,程序按預期終止。EDIT2:正如 Mark Plotnick 指出的那樣,這個問題與 ssh 通道上沒有通信流通的事實有關。我已經通過
ssh -t <host> read
之後執行並終止 ssh 程序來確認。read
還活著,還在踢。
通常當 ssh 連接終止時,shell 也會終止。您可以將 shell 配置為在它終止給所有子代時發送信號 -1 (SIGHUP)。
對於 bash,您可以通過內置命令shopt配置此選項。(
shopt -s huponexit
)。對於你想要的 zsh 。
setopt
HUP
我發現只需將
-t -t
其用作參數即可ssh
使其發揮作用。我不必設置huponexit
為原始 shell 或遠端 shell。我對此進行瞭如下測試:
不起作用:
ssh user@remote sleep 100 ^C
這殺死了 ssh 會話,但我可以看到睡眠程序仍在遠端主機上執行(
ps -ef | grep sleep
顯示它)。是否有效:
ssh -t -t user@remote sleep 100 ^C
這會終止 ssh 會話,並且遠端睡眠程序也被終止。我還驗證了發送到遠端程序的信號是
SIGINT
如果您使用Control
-C
。我還驗證了應用於ssh
程序的 SIGKILL (-9) 也會殺死遠端程序。編輯1:
這對於……對於更頑固的遠端程序來說是
sleep
正確的,我發現ssh
處理 ^C 的方式與 SIGINT 不同。Ctrl
-C
工作,但kill -INT $pid
沒有。這是我最終想出的適用於我的實際應用程序的內容(從其他答案中竊取)。
ssh -t -t -i id_rsa user@mic0 "/bin/sh -O huponexit -c 'sleep 100'"
注意雙引號和單引號的嵌套使用。請注意,您的遠端程序必須通過實際退出來響應 SIGHUP!