假设我使用非交互式 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