Python-在终止和处理信号(SIGINT和SIGTERM)时尝试调用处理程序

时间:2020-06-26 18:17:16

标签: python signals sigint sigterm

我有一个python程序,可以在启动时打开文件。该程序有望在机器/服务器停机之前运行,并且在运行时将其写入/追加到数据文件(如日志)中,大约每5秒钟执行一次。 如果每次打开都会关闭RAM,那么对于RAM来说可能太多了,所以我从一开始就打开文件,并计划在退出时关闭文件。

它是通过机器的停止脚本退出还是由用户使用脚本或ctrl + c调用它退出,我希望它在退出时调用退出处理程序,如下所示:

def handler(signum, frame):
    f = open(FILE_NAME)
    if not f.closed:
        f.close()
        print ("the file has been closed now")
    sys.exit(0)

if __name__ == "__main__":
    #atexit.register(handler)
    signal.signal(signal.SIGTERM, handler)
    signal.signal(signal.SIGINT, signal.SIG_DFL)
    signal.signal(signal.SIGINT, handler)
  1. atexit.register() signal.signal(signal.SIGTERM,处理程序)有什么区别?
  2. 如果我 include signal.signal(signal.SIGINT,signal.SIG_DFL),当我使用ctrl + c终止程序时,它不会关闭文件正确地表示数据未写入数据转储中。为什么会这样呢?我该如何解决这个问题?
  3. 如果我不包含 signal.signal(signal.SIGINT,signal.SIG_DFL),则数据文件将被更新;但是,我看到一个难看的终止消息(KeyboardInterrupt)。如何使它干净地终止?
  4. 如果我同时使用 signal.signal(signal.SIGTERM,处理程序)和signal.signal(signal.SIGINT,处理程序),它会退出而不会引发额外的消息并更新文件正在写(我想这意味着文件已正确关闭)-但正在运行python程序的会话挂起。就像在打印闭合线之后,它就挂了。当我ps时,我可以看到该进程仍从另一个终端运行。我怎样才能解决这个问题?如果我再次在该会话上执行ctrl + c,则此过程最终会消失。但是,该 sys.exit(0)不能解决这个问题吗?
  5. 如何将 FILE_NAME 作为参数传递给处理程序?我尝试将其添加到 signal.signal ,但是退出时,出现错误的参数数量错误:(
  6. 在程序运行时打开文件时,是否有一种方法可以使file.write()拥有最新数据,而不必等到它关闭之后?我可能做错了...为什么我必须等到文件关闭才能看到内容?我想知道记录器是否是用于此目的的更好方法。

谢谢!

0 个答案:

没有答案