我有一个每晚执行的脚本runReports.py
。假设由于某种原因脚本执行时间太长,我希望能够通过发出像./runReports.py stop
这样的命令来终止它。
我尝试通过让脚本在发出stop命令时创建临时文件来实现这一点。
脚本在运行每个报告之前检查是否存在此文件。
如果文件在那里,脚本停止执行,否则它继续。
但我无法找到让stop命令的发行者知道脚本已成功停止的方法。以下内容:
$ ./runReports.py stop
Stopping runReports...
runReports.py stopped successfully.
如何实现这一目标?
答案 0 :(得分:0)
您希望实现进程间通信。您应该首先探索不同的方法:系统V IPC(内存,非常通用,可能令人困惑的API),套接字(包括unix域套接字)(内存,更有限,干净的API),文件系统(持久在磁盘上,几乎建筑独立),并选择你的。
当您询问文件时,仍然有两种使用文件进行通信的方式:使用文件内容(功能丰富,难以实现),或者只是文件存在。但是使用文件的问题是程序因为错误而终止,它可能无法在磁盘上写入其结束状态。
恕我直言,你应该在选择基于文件系统的通信之前明确定义你的要求(测试程序的结尾并不是最好的),除非你还需要架构独立性。要直接回答您的问题,如果您使用文件系统通信,了解程序是否已经结束的唯一可靠方法是浏览当前活动进程的列表,最简单的方法是恕我直言使用ps -e
子流程。
答案 1 :(得分:0)
例如,如果您的脚本在循环中运行,您可以捕获信号http://en.wikipedia.org/wiki/Unix_signal并终止进程:
import signal
class SimpleReport(BaseReport):
def __init__(self):
...
is_running = True
def _signal_handler(self, signum, frame):
is_running = False
def run(self):
signal.signal(signal.SIGUSR1, self._signal_handler) # set signal handler
...
while is_running:
print("Preparing report")
print("Exiting ...")
要终止进程,只需调用kill -SIGUSR1 procId
答案 2 :(得分:0)
您可以拥有一个永久文件(config.txt),而不是拥有一个临时文件,该文件中包含一些标记,并检查标记'running = True'。
要实现这一点很简单,如果你的代码中有一个循环(我想它会这样做),只需创建一个在这个文件上分支检查条件的函数/方法。
def continue_running():
with open("config.txt") as f:
for line in f:
tag, condition = line.split(" = ")
if tag == "running" and condition == "True":
return True
return False
在您的脚本中,您将执行此操作:
while True: # or your terminal condition
if continue_running():
# your regular code goes here
else:
break
所以你要做的就是停止脚本中的循环,将'running'更改为除“True”之外的任何内容。