【发布时间】:2012-07-18 15:10:29
【问题描述】:
我有一个用 Python 编写的线程服务器,我开始使用以下 shell 脚本:
#!/bin/bash
base_path="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
public_dns=$(curl -s http://169.254.169.254/latest/meta-data/public-hostname)
echo $public_dns > "$base_path/client/address"
cd "$base_path/server"
python "server.py" &
echo $! > "$base_path/server_pid"
echo "Server running"
我将 PID 回显到一个文件,以便我可以使用另一个 shell 脚本关闭服务器:
#!/bin/bash
base_path="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
kill -9 `cat "$base_path/server_pid"`
rm "$base_path/server_pid"
rm "$base_path/client/address"
但是,我知道,考虑到服务器有许多线程将 I/O 输入到网络和硬盘中,这是一种不好的方法......所以我想做的是让第二个脚本以某种方式与服务器交互,并且告诉它启动一个关闭序列,该序列将干净地关闭所有线程、关闭和归档日志等。
现在我知道了atexit,并以这种方式对其进行了测试:
import atexit
def byebye(o):
o.write('stop')
o.flush()
o.close()
o = open('log','w')
o.write('start')
o.flush()
atexit.register(byebye, o)
while True:
pass
但是当我kill -9 进程时,byebye() 不会被解雇。我应该使用almighty kill -9 以外的命令吗?我将如何关闭该进程?
【问题讨论】:
-
那么套接字呢?您可以写入本地文件套接字或使用网络套接字(特定端口可能且仅通过 localhost 进行通信)。在那里你可以告诉它关闭。杀好像有点狠……
-
只要您没有任何
try/except KeyboardInterrupt子句,您就可以使用kill -2,因为它会发送SIGINT。一个更干净的解决方案是在 python 中注册一个调用sys.exit的信号处理程序——虽然我不确定它是如何工作的,因为你在一个线程环境中...... -
我曾想过将“停止”一词写入一个将由服务器持续监控的文件,但那是另一个要启动的线程,我认为也许有更优雅的方式来做这在 Python 中
-
cd是不必要的;base_path=$(dirname "${BASH_SOURCE[0]}") -
@mgilson:经过一些测试,我认为您的方法是最好的,请将其发布为答案,以便我接受。
标签: python bash process exit kill