【发布时间】:2013-08-27 14:19:33
【问题描述】:
在 linux shell 中,我可以运行这个命令来杀死我的 python 脚本(由sudo python3 server.py 启动)创建的每个进程:
sudo kill -9 `ps -ef | grep server.py |grep -v "grep"|awk '{{print $2}}'
我想将此添加到我的脚本并在开始时结束任何以前的脚本进程,以避免出现套接字“地址已在使用”错误。
这是我的代码:
try:
application.listen(port=63)
except OSError as e:
if e.errno == errno.EADDRINUSE:
cmd = 'sudo kill -9 `ps -ef | grep server.py |grep -v "grep"|awk \'{{print $2}}\'`'
print('try to kill previous',cmd)
import os
os.system(cmd)
问题是这也会杀死新进程,因为它也是由相同的关键字启动的。
我怎样才能避免这种情况?
【问题讨论】:
-
首先:这是个坏主意。如果你不小心杀死了重要的东西怎么办?其次:您正在检查
EADDRINUSE。即使后台没有运行server.py,您的代码也可能会抛出它,因为操作系统没有足够的时间来重置套接字。通常你做错了! -
我想知道怎么做。我没有决定这是否危险。或者更安全的方式来完成这项任务?
-
我喜欢避免在 python 中使用命令行,大多数情况下都有一个有用的模块,比如
psutil在这种情况下,不幸的是我几乎没有任何经验,但你可以访问进程和网络信息(也许在该端口获取程序绑定的 pid) -
@user2003548 更安全的方法是向您的应用程序添加服务器关闭方法(例如通过 TCP 触发)。然后你编写一个单独的脚本来处理服务器关闭。最后,您的主脚本必须循环执行
app.listen(...)(如果TIME_WAIT在套接字上)。 -
kill -9应该是最后的手段,而不是标准方法。kill发送的默认信号应该足够了。