Python脚本的干净关闭(Clean shutdown of a Python script)

2019-07-30 12:20发布

我有一个线程服务器用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()不开除。 我应该使用一个命令以外的全能kill -9 ? 我怎么会去关闭进程?

Answer 1:

我不是特别用于编程与线程,但不是发送kill -9 (对应于SIGKILL ),您可以发送SIGINT或一些其它用户定义的信号。 SIGINTkill -2我的系统上)是不错的,因为一个已经被蟒蛇的理解。 (当蟒蛇捕捉任何信号,它提出了一个KeyboardInterrupt ),但任何信号会工作。 你只需要注册完全退出程序的信号处理程序。



Answer 2:

在我看来,你正试图实现一个守护进程。 有关于蟒蛇守护进程实现各种参考:

上一页stackoverlow问题: 你如何在Python中创建一个守护进程?

关于守护PEP: http://www.python.org/dev/peps/pep-3143/

Python模块实现PEP3143: http://pypi.python.org/pypi/python-daemon/

需要注意的是PEP是一个草案。

更多关于守护进程: http://en.wikipedia.org/wiki/Daemon_%28computing%29

通常情况下,守护进程启动,停止并重新启动:

mydaemon start
mydaemon stop
mydaemon restart

所以你不需要知道PID或其他任何阻止它。



Answer 3:

kill 9是原子动力-你不会照顾自己清理。 更好的方法是使用一个不同的,温和的,信号( HUP常用信号的服务器进程,这是时间关闭,例如),并告诉你的Python代码如何优雅地处理它。

该信号模块文档应该让你开始。



文章来源: Clean shutdown of a Python script