如何在不杀死python脚本的情况下停止它?

时间:2015-03-17 13:39:31

标签: python linux unix

我想知道是否有办法在python脚本运行时停止它,而不会杀死它。

例如,我知道ctrl + z or c会杀死当前进程..但我不想杀死该程序..

我的python程序一次只接受一个文件并执行一些作业。 每个文件大约需要10~20分钟,具体取决于文件的大小..目录中有很多文件..

但有时我必须让它完成当前正在处理的文件,在当前文件之后立即停止程序,而不是在工作中间将其删除。

我怎么能在python中这样做?如果可以,我想写这个python编码..

我已经尝试了

if os.path.exists(filename)
    sys exit(0)

但是这一个,我必须在它运行时创建一个文件,这样当它到达那个文件时,它会停止......但不是这样做..我想看看是否有更好的方法来阻止它。

3 个答案:

答案 0 :(得分:4)

  

但有时我必须让它完成当前正在处理的文件,在当前文件之后立即停止程序,而不是在工作中间将其删除。

这比Ctrl + Z更具体;你要求停止该计划,但不是马上。你可以使用信号。使用signal设置信号处理程序,并在命令行使用kill -SIGWHATEVER调用它。一般来说,信号处理程序应该只设置一个你定期检查的标志;它实际上不应该做任何事情"本身,因为你不知道你的节目在被呼叫时处于什么状态。

信号处理程序是一个在程序收到信号时被调用的函数。它们是使用signal.signal()设置的。信号通过kill程序或kill()系统调用发送。你的处理程序看起来像这样:

stop = False
def handler(number, frame):
    global stop
    stop = True
signal.signal(signal.SIGUSR1, handler)
for file in files:  # or whatever your main loop looks like
    # Process one file
    if stop:
        break

答案 1 :(得分:1)

Ctrl+Z只会暂停进程,而不会将其杀死。您可以稍后键入fg以恢复它(“fg”代表“前景”。此外,您可以为“背景”运行“bg”)。根据您的描述,这听起来像是一个很好的解决方案,可以达到您想要的效果。

当然,这适用于任何进程,而不仅仅是python。

答案 2 :(得分:0)

您还可以捕获中断异常(Ctrl + C),然后处理未完成的文件并退出。

`def main():
    try:
        for file in file_list:
            process(file)
    except KeyboardInterrupt:
        process(file)
        raise Exception`