Friday, October 29, 2021

[SOLVED] How to execute a local bash script on remote server via ssh with nohup

Issue

I can run a local script on a remote server using the -s option, like so:

# run a local script without nohup...
ssh $SSH_USER@$SSH_HOST "bash -s" < myLocalScript.sh;

And I can run a remote script using nohup, like so:

# run a script on server with nohup...
ssh $SSH_USER@$SSH_HOST "nohup bash myRemoteScript.sh > results.out 2>&1 &"

But can I run my local script with nohup on the remote server? I expect the script to take many hours to complete so I need something like nohup. I know I can copy the script to the server and execute it but then I have to make sure I delete it once the script is complete, would rather not have to do that if possible.

I've tried the following but it's not working:

# run a local script without nohup...
ssh $SSH_USER@$SSH_HOST "nohup bash -s > results.out 2>&1 &" < myLocalScript.sh; 

Solution

You shouldn't have to do anything special - Once you kick off a script on another machine, it should finish running even if you terminate the connection:

For example

ssh $SSH_USER@$SSH_HOST "bash -s > results.out 2>&1" < myLocalScript.sh &

# Please wait a few seconds for the connection to be established
kill $! # Optional: Kill the last process

If you want to test it, try a simple script like this

# myLocalScript.sh
echo 'File created - sleeping'
sleep 30
echo 'Finally done!'

The results.out file should immediately be created on the other machine with "File created - sleeping" in it. You can actually kill the local ssh process with kill <your_pid>, and it will still keep running on the other machine, and after 30 seconds, print "Finally done!" into the file, and exit.



Answered By - Addison