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

时间:2011-01-05 17:46:38

标签: python cron

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

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

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

6 个答案:

答案 0 :(得分:4)

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

您需要写出您的用例。

  1. 系统发送消息,用户执行某些操作。

  2. 系统发送消息,用户不执行任何操作。为什么要再次给用户发送电1封电子邮件没有做2封电子邮件怎么办?也许你应该发短信或发电子邮件给别人。

  3. 用户如何注册某些内容?他们将如何取消或停止此消息循环?

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

您每五分钟运行一次。你为什么要睡觉呢?刚退出如果您想确保它不会每五分钟发送一次电子邮件,那么如果有任何要发送的内容,请让程序只发送一封电子邮件。

如果你睡了一个小时,并且每五分钟运行一次,一小时后你就会运行12份(并发送12封电子邮件),这显然不是前进的方法。 : - )

答案 4 :(得分:0)

另一种方法可能是将脚本作为守护程序运行,而不是让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)

答案 5 :(得分:0)

由于您正在监视日志文件,因此可能需要检查已经执行日志文件监视的内容。 Logwatch是一款,但有一些日志分析工具,可以为您处理所有这些事情:

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

是一些很好的总结。他们会对人们大喊大叫。还有系统监控工具,如opennms或nagios等。他们也做这些事情。

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

我仍然建议使用一个系统监控工具,它可以轻松扩展和扩展,并处理人们可以说“我正在努力工作XX现在不要再对我大喊大叫”。

祝你好运!