Get ssh to forward signals
Short answer:
ssh -t fs "stty isig intr ^N -echoctl ; trap '/bin/true' SIGINT; sleep 1000; echo f" > foo
and stop the program by CTRL+N.
Long explanation:
- You must use
stty
optionintr
to change your server or local interrupt character to not collide with each other. In the command above I've changed the server interrupt character to CTRL+N. You can change your local interrupt character and leave the server's one without any changes. - If you don't want the interrupt character to be in your output (and any other control character) use
stty -echoctl
. - You must assure that control characters are switched on on the server bash invoked by sshd . If you don't you can end up with processes still hanging around after you logout.
stty isig
- You actually catch
SIGINT
signal bytrap '/bin/true' SIGINT
with empty statement. Without the trap you will not have any stdout after SIGINT signal on your end.
I tried all the solutions and this was the best:
ssh host "sleep 99 < <(cat; kill -INT 0)" <&1
https://stackoverflow.com/questions/3235180/starting-a-process-over-ssh-using-bash-and-then-killing-it-on-sigint/25882610#25882610
I think you could find PID of the process you're running on server and send a signal using another ssh
command (like this: ssh server "kill -2 PID"
).
I use this method for sending reconfiguration signals to applications running on a different machine (my applications catch SIGUSR1 and read a config file). In my case finding PID is easy, because I have unique process names and I can find the PID by sending a ps
request via ssh
.