Python如何检查应用程序是否被强制关闭

6
假设我有一个在终端窗口中运行的Python文件'program.py'。当手动终止它运行的窗口时,我需要该程序将类似于“强制关闭”的内容记录到文件中。我已经阅读了该程序发送-1状态代码表示执行失败,但如何读取并根据此执行操作呢?

也许你可以使用信号模块 http://pymotw.com/2/signal/ - Timothy Ha
2个回答

7
你不能这样做。一个进程无法读取自己的退出代码。那没有多大意义。但是为了强制关闭进程,操作系统必须向该进程发送一个信号。只要不是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系统。我不太了解其他操作系统。

谢谢您的回答,这个kill命令是否包括从任务管理器(Windows)中移除该进程? - T90
@T90 抱歉,我假设我们正在讨论 POSIX 系统(Linux)。希望在 Windows 下有些类似,但我并不确定。不过你可以测试一下然后让我知道。 :) - freakish
抱歉回复晚了,但那种方法只适用于Linux。 - Rahul A Ranger

1
如果进程被杀死,程序就结束了,他不能在消失之前做其他事情。对于返回代码,每个程序都有一个返回代码,按照惯例,0表示没有问题,所有其他值都表示问题,但只有当程序终止而不是被杀死时才会出现。您还有一个进程状态和信号,它可以为您提供所需的信息,但不包括脚本本身。因此,您需要两个脚本,一个脚本启动并观察第二个脚本(使用Popen),并检查是否向第二个脚本发送了特定信号。
编辑:这仅适用于Linux,并且如果父级也被杀死,则无法工作。对于Windows,您将需要pywin32模块,可以捕获控制台关闭事件,我不知道右键单击=>任务管理器关闭,但请尝试https://danielkaes.wordpress.com/2009/06/04/how-to-catch-kill-events-with-python/

@freakish提到的方法怎么样?那段代码也需要放在单独的脚本中吗? - T90
他是错的。你不需要两个进程,那只会增加不必要的复杂性。因为你可以向父进程发送一个终止信号(特别是在SIGHUP的情况下)。这样做并没有任何好处。 - freakish
您可以检查SIGKILL和SIGSTOP信号的可能性。 - Ludovic Viaud
这就引出了一个问题:谁终止观察者和被观察者,你能保证顺序吗? - deets
任何拥有足够权限的人都可以以任意顺序终止两个进程,你无法保证任何事情,这个解决方案只在观察者被杀死之前杀死被观察者时才有效,并且仅适用于Linux。对于Windows,我没有找到其他解决方案,除了使用pywin32和类似freakish代码的东西,但是要使用Windows特定的信号等效于终止,而不是kill。 - Ludovic Viaud
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接