Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to run a command in background using ssh and detach the session

Tags:

I'm currently trying to ssh into a remote machine and run a script, then leave the node with the script running. Below is my script. However, when it runs, the script is successfully run on the machine but ssh session hangs. What's the problem?

ssh -x $username@$node 'rm -rf statuslist
                        mkdir statuslist
                        chmod u+x ~/monitor/concat.sh
                        chmod u+x ~/monitor/script.sh
                        nohup ./monitor/concat.sh &
                        exit;'
like image 402
Progress Programmer Avatar asked Oct 27 '09 00:10

Progress Programmer


2 Answers

There are some situations when you want to execute/start some scripts on a remote machine/server (which will terminate automatically) and disconnect from the server.

eg: A script running on a box which when executed

  1. takes a model and copies it to a remote server
  2. creates a script for running a simulation with the model and push it to server
  3. starts the script on the server and disconnect
  4. The duty of the script thus started is to run the simulation in the server and once completed (will take days to complete) copy the results back to client.

I would use the following command:

ssh remoteserver 'nohup /path/to/script `</dev/null` >nohup.out 2>&1 &'

@CKeven, you may put all those commands on one script, push it to the remote server and initiate it as follows:

echo '#!/bin/bash  
rm -rf statuslist  
mkdir statuslist  
chmod u+x ~/monitor/concat.sh  
chmod u+x ~/monitor/script.sh  
nohup ./monitor/concat.sh &  
' > script.sh

chmod u+x script.sh

rsync -azvp script.sh remotehost:/tmp

ssh remotehost '/tmp/script.sh `</dev/null` >nohup.out 2>&1 &'

Hope this works ;-)

Edit: You can also use ssh user@host 'screen -S SessionName -d -m "/path/to/executable"'

Which creates a detached screen session and runs target command within it

like image 166
Jayan Avatar answered Sep 21 '22 08:09

Jayan


What do you think about using screen for this? You could run screen via ssh to start the command (concat.sh) and then you'd be able to return to the screen session if you wanted to monitor it (could be handy, depending on what concat does).

To be more specific, try this:

ssh -t $username@$node screen -dm -S testing ./monitor/concat.sh

You should find that the prompt returns immediately, and that concat.sh is running on the remote machine. I'll explain some of the options:

  • ssh -t makes a TTY. screen needs this.
  • screen -dm makes it start in "detached" mode. This is like "background" for your purposes.
  • -S testing gives your screen session a name. It is optional but recommended.

Now, once you've done this, you can go to the remote machine and run this:

screen -r testing

This will attach you to the screen session which contains your program. From there you can control it, kill it, see its output, and so on. Ctrl-A, then d will detach you from the screen session. screen -ls will list all running sessions.

like image 38
John Zwinck Avatar answered Sep 20 '22 08:09

John Zwinck