如何停止python脚本

时间:2015-03-17 18:16:06

标签: python linux unix

我正在尝试编写一个python脚本,该脚本还用信号处理杀死/停止自己的进程。

它一次运行一个文件,在特定时间休眠并再次运行,直到它完成整个目录中的文件。每个文件的处理时间大约为5到10分钟,具体取决于大小。

但是,当我发出信号时,我希望我的程序停止。它不应该立即杀死它。它应该运行当前文件并在之后停止。

所以我不能使用 CTRL Z ,因为它会立即暂停pid。

stop = False
def handler(number, frame):
    global stop
    stop = True
signal.signal(signal.SIGUSR1, handler)
while not stop:
    # Do things

以上就是我尝试过的,但是当我发出信号时,它会立即杀死它。即使在完成所有文件的处理后,它也会进入无限循环。

当我发出信号时,我该怎么做才能停止这个过程,让它先完成当前文件的处理?

2 个答案:

答案 0 :(得分:1)

您可以创建命令侦听器线程。主线程仍然进行文件处理。例如,侦听器线程等待来自标准输入的命令。当您发送“停止”命令时,它会设置变量。文件处理器线程在处理文件之前检查变量。因此,当您想要停止处理时,它可以停止。

答案 1 :(得分:1)

只需为signal.SIGTERM安装一个信号处理程序 - 然后在程序中设置一个状态变量,在完成处理每个文件时检查它。

实际上非常简单 - 请参阅以下文档:https://docs.python.org/2/library/signal.html

import os 
import signal
terminate = False

for filename in os.listdir("<your dir>"):
    if terminate:
       break
    process_next_file(filename)

def handler(signum, frame):
    global terminate
    print("Termination requested")
    terminate = True

signal.signal(signal.SIGTERM, handler)

(另外,你可以使用其他信号 - 例如用户按ctrl + C时使用的SIGINT)