如何停止 python 脚本

How to stop the python script

我正在尝试编写一个 python 脚本,该脚本还处理 killing/stopping 它自己的信号处理过程。

它 运行 每次一个文件,在特定时间休眠并再次 运行 直到它用文件完成整个目录。每个文件的处理时间约为 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

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

当我发出信号时如何停止进程,让它先完成当前文件的处理?

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

只需为 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)

(此外,您还可以使用其他信号 - 例如,SIGINT 是用户按下 ctrl+C 时使用的信号)