如何在没有伪终端的情况下停止非交互式SSH调用程序

如何在没有伪终端的情况下停止非交互式SSH调用程序

假设我使用非交互式 SSH 调用(没有伪终端)启动一个程序,并通过以下方式退出会话CTRLC

$ ssh user@server -- sleep 123
^C

这样,即使在 SSH 会话终止后,程序(sleep 123例如本例中的程序)仍会在 上运行:server

$ ssh user@server -- ps -ef | grep "sleep 123"
user     12430       1  0 19:28 ?        00:00:00 sleep 123

我知道可以ssh选择-t将 SIGINT 发送到远程sleep而不是本地ssh。但我正在寻找一种方法来使远程程序停止,而不必求助于伪终端并在调用中指定额外的选项ssh

答案1

我针对某些情况提出了部分解决方案。

这个想法是这样的:当ssh在客户端上被杀死时,任何由命令运行的程序都会server丢失其父进程并被分配init为其父进程。

因此,如果您能够编辑正在运行的程序server以连续检查父 PID,那么您会注意到,一旦它切换到 1,因此ssh客户端上的进程一定已终止。

cat <<-"EOF" | ssh user@server sh
while :; do
sleep 1
ppid="$(ps -p "$$" -o ppid= | tr -d "[:blank:]")"
[ "$ppid" = 1 ] && break
done
EOF

相关内容