Можно ли отправить сигнал SIGTERM (или другой) процессу внутри ssh, например:
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'