当从终端发出命令时,使脚本能够自行停止

时间:2015-01-27 18:35:20

标签: python linux

我有一个每晚执行的脚本runReports.py。假设由于某种原因脚本执行时间太长,我希望能够通过发出像./runReports.py stop这样的命令来终止它。

我尝试通过让脚本在发出stop命令时创建临时文件来实现这一点。

脚本在运行每个报告之前检查是否存在此文件。

如果文件在那里,脚本停止执行,否则它继续。

但我无法找到让stop命令的发行者知道脚本已成功停止的方法。以下内容:

$ ./runReports.py stop
  Stopping runReports...
  runReports.py stopped successfully.

如何实现这一目标?

3 个答案:

答案 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”之外的任何内容。