Python检查强制关闭

时间:2014-11-18 14:46:44

标签: python python-2.7

假设我在终端窗口中运行了一个python文件'program.py'。当手动终止运行它的窗口时,我需要该程序将类似“强制关闭”的内容记录到文件中。我已经读过程序发送的状态代码为-1,表示执行不成功,但是如何根据它读取和执行某些操作?

2 个答案:

答案 0 :(得分:5)

你做不到。进程无法读取自己的退出代码。这没有多大意义。但是为了强制进程关闭,操作系统必须向该进程发送信号。只要它不是SIGKILL和/或SIGSTOP,那么您可以通过signal库拦截它。无法阻止SIGKILL和SIGSTOP,例如如果有人kill -9,那么你无能为力。

使用信号库:

import signal
import sys

def handler(signum, frame):
    # do the cleaning if necessary

    # log your data here
    with open('log.log', 'a') as fo:
        fo.write('Force quit on %s.\n' % signum)

    # force quit
    sys.exit(1)  # only 0 means "ok"

signal.signal(signal.SIGINT, handler)
signal.signal(signal.SIGHUP, handler)
signal.signal(signal.SIGTERM, handler)

当终端关闭时,它会向进程发送SIGHUP。

SIGINT用于CTRL-C中断。

SIGTERM与SIGKILL类似。不同之处在于流程可以捕获它。这是一场“优雅的杀戮”。

重要提示:所有POSIX系统都适用。我对其他操作系统了解不多。

答案 1 :(得分:1)

你不能这样做,如果程序被杀死程序结束了,他就不能做其他事情就消失了。对于返回代码它是不同的,每个程序都有一个返回代码,按惯例0表示没问题,所有其他值表示有问题,但只有在程序终止时才会被杀死。您还有一个进程状态和信号,它可以为您提供所需的信息,但不会在脚本本身。因此,根据您的需要,您将需要2个脚本,一个脚本启动并观察第二个脚本(使用Popen)并检查特定信号是否已发送到第二个脚本

编辑:这只适用于linux,如果父亲也被杀了也行不通,对于Windows你需要pywin32模块,它可能会关闭控制台,我不知道右键单击=&gt ;关闭任务管理器但请尝试https://danielkaes.wordpress.com/2009/06/04/how-to-catch-kill-events-with-python/