当 ssh 终止时杀死由 ssh 产生的进程

Ger*_*anK 24 ssh kill

这是一个已经多次解决的问题,不仅在这里,而且在堆栈交换网络的其他站点中也是如此(例如,当我中断 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还活着,还在踢。

Mar*_*ata 19

我发现只需将其-t -t用作参数即可ssh使其工作。我不必设置huponexit为原始 shell 或远程 shell。

我对此进行了如下测试:

不起作用:

ssh user@remote sleep 100
^C
Run Code Online (Sandbox Code Playgroud)

这终止了 ssh 会话,但我可以看到睡眠进程仍在远程主机上运行(ps -ef | grep sleep显示它)。

是否有效:

ssh -t -t user@remote sleep 100
^C
Run Code Online (Sandbox Code Playgroud)

这会终止 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'"
Run Code Online (Sandbox Code Playgroud)

注意双引号和单引号的嵌套使用。请注意,您的远程进程必须通过实际退出来响应 SIGHUP!


Hen*_*nes 14

通常当 ssh 连接终止时,shell 也会终止。您可以将 shell 配置为在它终止时向其所有子进程发送信号 -1 (SIGHUP)。

对于 bash,您可以通过内置命令shopt配置此选项。( shopt -s huponexit).

对于你想要的 zsh 。setoptHUP

  • 这对我有用,但我必须首先确保我使用的是 `ssh -t -t`,(注意 `-t` 两次!)这会强制 tty 分配,而不仅仅是 pty。 (3认同)