Bash:通过ssh启动远程python应用程序并获取它的PID

我正在创build一个小bash脚本来从Windows机器复制新文件到远程Linux centos服务器(我运行这个脚本使用git-shell),然后我想重新启动在服务器上运行的python应用程序来使用这些新的文件。

问题是,我每次运行这个脚本,我想结束实际运行过程之前,我再次启动,所以我想获得我开始的进程的PID,并将其保存到远程主机中的文件,所以我可以读它从那里下一次我运行程序并杀死它。

现在我的代码看起来类似于这样的:

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!" 

重要的线是:

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

与此问题是脚本完成,但文件结束了空以及$ SERV_PIDvariables。

如果我不redirect输出,只是做这样的事情:

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

我在“重新启动服务器”之后卡住,并且永远不会获取将包含它的PID或文件,甚至脚本的结尾。

但是,如果我在控制台中运行这个权利:

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

我得到一个PID打印到terminal。

任何意见,将非常感激。

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

通过上面的代码,你正在运行两个ssh命令,两者都创建两个不同的shell。 问题是echo $! 给出了当前 shell中最新的后台进程ID。

也就是说,当你第二次ssh的时候,它是新的 shell,没有后台进程运行,因此echo $! 没有输出。 这就解释了为什么你的PID文件是空的。

相反,你可以做的是查找你的Python脚本的所有实例,并杀死他们使用killall命令。 或者使用ps命令类似的想法。

感谢Kingslndian,我用一个命令完成了我所需要的三个步骤来解决这个问题,所以避免了在不同shell中运行的问题:

  ssh root@myserver 'python /root/python/run_dev_server.py > /dev/null 2>&1 & echo $! > "dmr.pid"'