Ssh

當 ssh 死亡時終止由 ssh 產生的程序

  • April 4, 2018

這是一個已經多次解決的問題,不僅在這裡,而且在堆棧交換網路的其他站點(例如,當我中斷 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 ktserveror時kill -2 ktserver,程序按預期終止。

EDIT2:正如 Mark Plotnick 指出的那樣,這個問題與 ssh 通道上沒有通信流通的事實有關。我已經通過ssh -t <host> read之後執行並終止 ssh 程序來確認。read還活著,還在踢。

通常當 ssh 連接終止時,shell 也會終止。您可以將 shell 配置為在它終止給所有子代時發送信號 -1 (SIGHUP)。

對於 bash,您可以通過內置命令shopt配置此選項。( shopt -s huponexit)。

對於你想要的 zsh 。setoptHUP

我發現只需將-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!

引用自:https://unix.stackexchange.com/questions/103699