In case it helps anyone, I want to share about a problem I faced which had me stumped for a bit - before I encountered the solution, which is non-obvious to say the least.
You can run commands on a remote host over
ssh like so:
ssh user@host "echo 'Hello World'"
Also, to run a command or script in the background, a frequently-seen command is the following:
nohup script &
nohup ensures that the command isn’t interrupted by the hangup signal (which can occur due to a number of reasons, such as user logging off) while the ending
& moves the shell command to the background.
However, the following does not work as expected:
ssh user@host "nohup ./script &"
ssh session terminates after some time, but the
script process is not started on the remote host.
It turns out that the reason why this occurs is that the
ssh server refuses to lose any I/O to and from the newly created remote process - this causes it to hang as it gets stuck waiting. Eventually, the ssh session terminates and the process is killed.
To avoid this, and to have the command execute in the background, we need to redirect all 3 I/O streams (
stderr) so that
ssh no longer gets stuck waiting for these data streams:
ssh user@host "nohup ./script &> script.out < /dev/null &"
This creates the new process in the background as expected, and closes the