【问题标题】:Bash: start remote python application through ssh and get its PIDBash:通过 ssh 启动远程 python 应用程序并获取其 PID
【发布时间】:2012-10-23 10:48:49
【问题描述】:

我正在创建一个小 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。

对此的任何建议将不胜感激。

【问题讨论】:

  • 您可能应该在远程服务器上编写一个 shell 脚本来执行您想要的操作:使用包含 pid 的文件终止先前的 python 脚本,运行 python 脚本并将 pid 保存在一个文件中。

标签: linux bash ssh remote-access pid


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:
    ssh root@myserver 'python /root/python/run_dev_server.py > /dev/null 2>&1 &'
    SERV_PID=$(ssh root@myserver 'echo $!')
    

    使用上面的代码,您正在运行两个 ssh 命令,并且都创建了两个不同的 shell。问题是echo $! 提供了来自 current shell 的最新后台进程的 ID,它没有。

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

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

    【讨论】:

    • 感谢您的回答,它给了我需要的提示,最后我通过一个命令完成了我需要的三个步骤来解决它,以避免使用不同的外壳。
    猜你喜欢
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 2016-07-23
    • 2018-02-21
    • 2012-10-23
    • 2014-09-26
    相关资源
    最近更新 更多