如何休眠作为 cronjob 运行的 python 脚本?

Posted

技术标签:

【中文标题】如何休眠作为 cronjob 运行的 python 脚本?【英文标题】:How to sleep a python script running as a cronjob? 【发布时间】:2011-01-05 17:46:37 【问题描述】:

我编写了一个 python 脚本来监视 CentOS 服务器上的日志文件中的特定值,并在找到它时发送电子邮件。它每 5 分钟运行一次。

我的问题是在发送第一封电子邮件后让该脚本进入睡眠状态的最佳方法是什么。我不希望它每 5 分钟发送一次电子邮件,但它需要在一个小时左右后唤醒并再次检查日志。这是假设问题可以在一小时内解决。接收电子邮件的人没有 shell 访问权限来禁用 cron。

我考虑过睡眠,但我不确定如果另一个进程处于活动状态(睡眠),cron 是否会再次尝试运行脚本。

【问题讨论】:

【参考方案1】:

cron 绝对会再次运行该脚本。您需要仔细考虑这一点,而不仅仅是“睡眠”和“每 10 分钟发送一次电子邮件”。

你需要写出你的用例。

    系统发送消息,用户做某事。

    系统发送消息,用户什么也不做。为什么要再次向用户发送电子邮件? 2 封电子邮件做了哪些 1 封电子邮件没有做的事情?也许你应该给别人发短信或发电子邮件。

用户如何注册某事已完成?他们将如何取消或停止这个消息循环?

如果在日志中找到某些内容,会发送一封电子邮件,然后(在睡眠结束之前)在日志中再次找到该内容。这是第二封电子邮件吗?这是两个事件。或者是一封包含两个事件的电子邮件?

【讨论】:

这些都是好点,如果一个小时内未处理该条件,则可以发送第二封邮件,该邮件可以发送给更广泛的用户。他们将通过修复生成日志消息的问题来停止消息。【参考方案2】:

@Lennart,@S。 Lott:我认为这个问题有点相反——脚本每五分钟作为一个 cron 作业运行,但在发送错误电子邮件后,它不应该在至少一个小时内发送另一个(即使错误状态仍然存在) .

我认为,显而易见的答案是保存一个自我日志 - 对于检测到的每个问题,最后一次发送电子邮件的 id 和时间戳。当检测到问题时,检查自日志;如果此问题 ID 的最后一封电子邮件不到一小时前,请不要发送该电子邮件。然后你的程序可以正常退出,直到被 cron 再次调用。

【讨论】:

我认为这是我将尝试实施的方法。我将在脚本开头添加一条语句来检查日志,并且仅在时间戳超过一小时时才继续。【参考方案3】:

当您的脚本发送电子邮件时,使其同时创建一个 txt 文件“email_sent.txt”。然后让它在发送电子邮件之前检查此 txt 文件是否存在。如果存在,请不要发送电子邮件。如果不存在,请发送电子邮件并创建文本文件。

文本文件用作指示电子邮件已发送,无需再次发送。

【讨论】:

我想过这个,但是如何重置条件?我需要在一小时后删除 txt 文件,或者有读取文件时间戳的逻辑。【参考方案4】:

您每五分钟运行一次。为什么要睡觉呢?就退出吧。如果您想确保它不会每五分钟发送一次电子邮件,那么请让程序仅在有任何要发送的情况下发送电子邮件。

如果您将其休眠一个小时,然后每五分钟运行一次,一个小时后您将运行 12 份副本(并发送 12 封电子邮件),因此这显然不是前进的方式。 :-)

【讨论】:

【参考方案5】:

解决此问题的另一种方法可能是将您的脚本作为守护程序运行,而不是让 cron 每五分钟运行一次,而是将您的逻辑置于循环中。像这样的...

while True:
  # The check_my_logfile() looks for what you want.
  # If it finds what you're looking for, it sends
  # an email and returns True.
  if check_my_logfile():
    # Then you can sleep for 10 minutes.
    time.sleep(600)
  # Otherwise, you can sleep for 5 minutes.
  else:
    time.sleep(300)

【讨论】:

【参考方案6】:

由于您正在监视日志文件,因此可能值得检查已经进行日志文件监视的事情。 Logwatch 是其中之一,但有一些日志分析工具可以为您处理所有这些事情:

http://chuvakin.blogspot.com/2010/09/on-free-log-management-tools.html

是对一些选项的一个很好的总结。他们会处理对人大喊大叫的问题。另外还有opennms或者nagios等系统监控工具,他们也做这些事情。

我同意上面其他人所说的,基本上 cron 总是在指定的时间运行作业,有一个名为 at 的工具可以让您将来运行作业,因此您可以批处理作业 5 分钟,并且然后在运行时决定,我什么时候需要再次运行,并在您需要它再次运行的任何时间(无论是 5 分钟、10 分钟还是一个小时)提交作业。您仍然需要将状态保存在某个地方(就像@infrared 所说的那样),以便弄清楚什么时候发送的,以及您是否应该关心更多。

我仍然建议使用系统监控工具,该工具可以轻松扩展和扩展并处理能够说“我在 XX 上工作,现在不要对我大喊大叫”的人。

祝你好运!

【讨论】:

以上是关于如何休眠作为 cronjob 运行的 python 脚本?的主要内容,如果未能解决你的问题,请参考以下文章

允许拒绝或尝试以CRONJOB作为CRONJOB运行PHP脚本以创建.txt文件时的某些内容

使用 Python 脚本作为 cronjob 读取 Gmail 邮件

在 EC2 上运行 cronjob(Python 写入文件)

Elastic Beanstalk 上的 Cronjob 未运行

如何每分钟更频繁地运行 Cronjobs?

如何每 X 分钟运行一次 cronjob?