击:通过ssh远程启动Python应用程序并获得其PID(Bash: start remote py

2019-08-02 06:36发布

我创建一个小bash脚本到新文件从Windows计算机复制到远程Linux CentOS的服务器(我运行使用Git的壳这个脚本),那么我要重新启动服务器中运行的使用这些新的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。

在这个任何意见将非常感激。

Answer 1:

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

与上面的代码,你正在运行的两个SSH命令和两个创建两个不同的炮弹。 问题是echo $! 给出从当前 shell这是没有最近的后台进程ID。

也就是说,当使用ssh第二次,这是新的外壳,有没有后台进程运行它,因此echo $! 不会有任何输出。 这就解释了为什么你的PID文件是空的。

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



Answer 2:

由于Kingslndian我解决了这个问题,方法是将该做的三个步骤我需要的,所以与避免在不同的壳运行的问题,一个命令:

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


文章来源: Bash: start remote python application through ssh and get its PID