Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bash: start remote python application through ssh and get its PID

I'm creating a little bash script to copy new files from a windows machine to a remote linux centos server (i run this script using the git-shell) then i want to restart the python application thats running in the server to use those new files.

The problem is that everytime i run this script i want to end the actual running process before i start it again, so i want to get the pid of the process i start and save it to a file in the remote host so i can read it from there the next time i run the program and kill it.

My code by now looks similar to this:

echo "Copying code files to server..."
# The destination folder has to exist in the server
scp -r ./python/ root@myserver:/root/

echo "Checking for running processes..."

if ssh root@myserver 'ls dmr.pid >/dev/null'; then
    echo "PID file exists, reading file..."
    PID=$(ssh root@myserver 'cat dmr.pid')

    # Terminate the actual process
    echo "Terminating the process with PID '$PID'..."
    ssh root@myserver 'kill $PID'
else
    echo "PID file doesn't exist, not known processes running"
fi

# Restart the server and get the PID
echo "Restarting the server..."
ssh root@myserver 'python /root/python/run_dev_server.py > /dev/null 2>&1 &'

SERV_PID=$(ssh root@myserver 'echo $!')

echo "Saving PID to file dmr.pid"
ssh root@myserver "echo '$SERV_PID' > \"dmr.pid\""

echo "Sucesfully finished!"

The important lines are:

ssh root@myserver 'python /root/python/run_dev_server.py > /dev/null 2>&1 &'
SERV_PID=$(ssh root@myserver 'echo $!')

the problem with this is that the script finishes but the file ends up empty as well as the $SERV_PID variable.

And if i dont redirect the outputs and just do something like this:

SERV_PID=$(ssh root@myserver 'python /root/python/run_dev_server.py & echo $!')

i get stuck after "Restarting the server" and never get the PID or the file that will contain it or even the end of the script.

But if i run this right in the console:

ssh root@myserver 'python /root/python/run_dev_server.py & echo $!'

i get a PID printed to the terminal.

Any advice on this would be really appreciated.

like image 294
jeruki Avatar asked Nov 02 '12 18:11

jeruki


Video Answer


2 Answers

ssh root@myserver 'python /root/python/run_dev_server.py > /dev/null 2>&1 &'
SERV_PID=$(ssh root@myserver 'echo $!')

With the above code, you are running two ssh commands and the both create two different shells. The problem is echo $! gives the most recent background process' ID from the current shell which is none.

That is, when you ssh for the second time, it's new shell and there's no background process running in it and hence echo $! gives no output. This explains why your PID file is empty.

Instead what you can do is to lookup for all instances of your python script and kill them using killall command. Or similar idea using ps command.

like image 178
P.P Avatar answered Oct 17 '22 00:10

P.P


Thanks to Kingslndian i solved it by making one single command that did the three steps i required, so with that avoided the problem of running in different shells:

 ssh root@myserver 'python /root/python/run_dev_server.py > /dev/null 2>&1 & echo $! > "dmr.pid"'
like image 21
jeruki Avatar answered Oct 17 '22 00:10

jeruki