干净关闭Python脚本

Dre*_*een 2 python bash kill process exit

我有一个用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"
Run Code Online (Sandbox Code Playgroud)

我将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"
Run Code Online (Sandbox Code Playgroud)

但是,我知道这是一个糟糕的方法,考虑到服务器有许多线程具有进入网络和硬盘的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
Run Code Online (Sandbox Code Playgroud)

但是,当我kill -9的过程,byebye()是不是被解雇了.我应该使用除了全能者kill -9以外的命令吗?我该如何关闭这个过程?

Nic*_*bey 5

在我看来,你正在尝试实现一个守护进程.在python中有关于守护进程实现的各种引用:

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

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

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

请注意,PEP是草案.

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

通常,守护程序启动,停止并重新启动,如下所示:

mydaemon start
mydaemon stop
mydaemon restart
Run Code Online (Sandbox Code Playgroud)

所以你不需要知道PID或其他任何东西来阻止它.