是否可以向 ssh 内部的进程发送 SIGTERM(或其他)信号,例如:
ssh hostname 'sleep 10; echo done'
我该怎么做才能中断 sleep 命令?如果我按 ctrl-c,ssh 命令就会中断。
答案1
可以ctrl+c
通过远程主机上的命名管道实现“EOF 到 SIGHUP”转换器来传播到远程进程(参见:ssh 终止后,ssh 命令意外地在其他系统上继续)。
ssh localhost '
TUBE=/tmp/myfifo.fifo
rm -f "$TUBE"
mkfifo "$TUBE"
<"$TUBE" sleep 100 & appPID=$!
dd of="$TUBE" bs=1 2>/dev/null
kill $appPID
#kill -TERM -- -$$ # kill entire process group
rm -f "$TUBE"
'
答案2
-t 可能会做你想做的事(参见https://superuser.com/a/20708/36198)。不幸的是,如果您还想读取 stdin,则需要分两步进行,第二步只需按 Ctrl+C,例如
tmp=$(bzcat foo.bz2 | ssh $user@$host '
t=$(mktemp -t foo.XXXXXXXXXXX);
cat >"$t";
echo "$t";
')
ssh -t $user@$host "./cmd \"$tmp\""
ssh $user@$host "rm -f \"$tmp\""
答案3
如果你知道远程进程的 pid,那么你可以执行以下操作:ssh hostname 'kill -TERM $pid'