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

jer*_*uki 7 linux ssh bash pid remote-access

我正在创建一个小的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!"
Run Code Online (Sandbox Code Playgroud)

重要的是:

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

这个问题是脚本完成但文件结束为空以及$ SERV_PID变量.

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

SERV_PID=$(ssh root@myserver 'python /root/python/run_dev_server.py & echo $!')
Run Code Online (Sandbox Code Playgroud)

我在"重新启动服务器"后陷入困境,永远不会得到PID或包含它的文件,甚至是脚本的结尾.

但如果我在控制台中正确运行:

ssh root@myserver 'python /root/python/run_dev_server.py & echo $!'
Run Code Online (Sandbox Code Playgroud)

我得到一个PID打印到终端.

对此的任何建议都将非常感激.

jer*_*uki 2

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

 ssh root@myserver 'python /root/python/run_dev_server.py > /dev/null 2>&1 & echo $! > "dmr.pid"'
Run Code Online (Sandbox Code Playgroud)