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

如何休眠作为cronjob运行的python脚本?,python,cron,Python,Cron,我编写了一个python脚本来监视CentOS服务器上的日志文件中的特定值,并在发现该值时发送电子邮件。它作为cron每5分钟运行一次 我的问题是,在这个脚本发送第一封电子邮件后,最好的方法是什么。我不希望它每5分钟发送一次电子邮件,但它需要在一个小时左右醒来并再次检查日志。这是假设问题可以在一小时内解决。接收电子邮件的人没有shell访问权限来禁用cron 我考虑过睡眠,但我不确定如果另一个进程处于活动睡眠状态,cron是否会再次尝试运行脚本。cron肯定会再次运行脚本。你需要更仔细地思考这一

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

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


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

cron肯定会再次运行脚本。你需要更仔细地思考这一点,而不仅仅是睡觉和每10分钟发一次电子邮件

你需要写出你的用例

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

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

用户如何注册某项操作?他们将如何取消或停止此消息循环


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

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

你需要写出你的用例

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

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

用户如何注册某项操作?他们将如何取消或停止此消息循环


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

您每五分钟运行一次。你为什么要睡它?出去吧。如果你想确保它不会每五分钟发送一次电子邮件,那么让程序只在有任何东西要发送时发送一封电子邮件


如果你睡一个小时,每五分钟运行一次,一个小时后,你将运行12份副本,发送12封电子邮件,因此这显然不是前进的方向-

您每五分钟运行一次。你为什么要睡它?出去吧。如果你想确保它不会每五分钟发送一次电子邮件,那么让程序只在有任何东西要发送时发送一封电子邮件


如果你睡一个小时,每五分钟运行一次,一个小时后,你将运行12份副本,发送12封电子邮件,因此这显然不是前进的方向-

@Lennart,@S.Lott:我认为问题是另一个方面——脚本作为cron作业每五分钟运行一次,但在发送错误电子邮件后,即使错误状态持续存在,至少一小时内也不应该再发送一封


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

@Lennart,@S.洛特:我认为问题在某种程度上是相反的-脚本作为cron作业每五分钟运行一次,但在发送错误电子邮件后,即使错误状态持续存在,它至少在一个小时内也不应该发送另一封


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

当您的脚本发送电子邮件时,让它也创建一个txt文件email\u sent.txt。然后在发送电子邮件之前检查是否存在此txt文件。如果存在,不要发送电子邮件。如果不存在,请发送电子邮件并创建文本文件


文本文件作为电子邮件已发送且无需再次发送的指示器。

当脚本发送电子邮件时,请使其也创建一个txt文件email\u sent.txt。然后在发送电子邮件之前检查是否存在此txt文件。如果存在,不要发送电子邮件。如果不存在,请发送电子邮件并创建文本文件


文本文件作为电子邮件已发送且无需再次发送的指示器。

另一种方法是运行 将script作为守护进程,而不是让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)

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

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

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

我同意上面其他人所说的,基本上cron总是在指定的时间运行作业,有一个名为at的工具可以让您在将来运行作业,因此您可以在5分钟内批处理一个作业,然后在运行时决定何时需要再次运行,并将作业提交给at,以便在任何时间重新运行,无论是5分钟、10分钟还是一小时。您仍然需要将状态保存在某个地方,如@infrared所说的,以确定何时发送了什么,以及您是否需要更多关注

我仍然建议使用一个系统监控工具,它可以很容易地增长和扩展,并处理人们能够说‘我正在处理XX,现在不要对我大喊大叫’的问题


祝你好运

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

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

我同意上面其他人所说的,基本上cron总是在指定的时间运行作业,有一个名为at的工具可以让您在将来运行作业,因此您可以在5分钟内批处理一个作业,然后在运行时决定何时需要再次运行,并将作业提交给at,以便在任何时间重新运行,无论是5分钟、10分钟还是一小时。您仍然需要将状态保存在某个地方,如@infrared所说的,以确定何时发送了什么,以及您是否需要更多关注

我仍然建议使用一个系统监控工具,它可以很容易地增长和扩展,并处理人们能够说‘我正在处理XX,现在不要对我大喊大叫’的问题


祝你好运

这些都是好的方面,如果在一个小时内不处理这种情况,第二封邮件就可以发送出去,可以发送给更广泛的用户。他们将通过修复生成日志消息的问题来停止消息。这些都是好的方面,如果在一小时内不处理这种情况,第二封邮件可能会发出,这可以发送到更广泛的用户。他们将通过修复生成日志消息的问题来停止消息。我考虑过这一点,但如何重置条件?我需要在一个小时后删除txt文件,或者用逻辑读取文件的时间戳。我考虑过这个问题,但是如何重置条件?我需要在一小时后删除txt文件,或者用逻辑读取文件的时间戳。我认为这是我将尝试并实现的方法。我将在脚本的开头添加一条语句来检查日志,并且仅当时间戳大于一小时时才继续。我认为这是我将尝试并实现的方法。我将在脚本的开头添加一条语句来检查日志,并且仅当时间戳大于一小时时才继续。