我正在创建一个小 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_PID 变量。
如果我不重定向输出而只是做这样的事情:
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。
对此的任何建议将不胜感激。