我正在创建一个小的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。
对此的任何建议都将非常感激。
答案 0 :(得分:4)
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时,它是 new shell,并且没有后台进程在其中运行,因此echo $!
没有输出。这解释了您的PID文件为空的原因。
相反,您可以执行的操作是查找python脚本的所有实例并使用killall
命令将其终止。或者使用ps
命令的类似想法。
答案 1 :(得分:2)
感谢Kingslndian我通过制作一个执行我需要的三个步骤的单个命令解决了它,因此避免了在不同shell中运行的问题:
ssh root@myserver 'python /root/python/run_dev_server.py > /dev/null 2>&1 & echo $! > "dmr.pid"'