我正在尝试编写一个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
以上就是我尝试过的,但是当我发出信号时,它会立即杀死它。即使在完成所有文件的处理后,它也会进入无限循环。
当我发出信号时,我该怎么做才能停止这个过程,让它先完成当前文件的处理?
答案 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)