我可以比每分钟更频繁地运行一个cron工作吗?

是否有可能每30秒运行一个cron作业而没有睡眠命令?

如果你的任务需要频繁运行,cron是错误的工具。 除了频繁发起工作这个事实,如果工作需要的时间比发射之间的时间间隔还要长,你也会面临一些严重的问题。 重写你的任务,守护进程并持续运行,然后从cron启动它(如果有必要的话,确保它不会重新启动)。

候选最有创意的 滥用 Linux命令的人:

 nohup watch -n 30 --precise yourprog >/dev/null & 

如果你的程序包含:

 date +%M.%S.%N >> yourprog.out 

那么yourprog.out可能看起来像:

 50.51.857291267 51.21.840818353 51.51.840910204 52.21.840513307 52.51.842455224 53.21.841195858 53.51.841407587 54.21.840629676 

表明一个相当好的精度水平。

以下是命令部分的解释:

  • nohup – 在这种情况下,保持跟在它nohup的命令,从terminal退出时退出。
  • watch – 这个程序反复运行一个命令。 通常,每次watch运行命令时,都会显示该命令的第一个输出屏幕。
  • -n 30 – 运行命令的时间间隔。 在这种情况下,每三十秒钟一次。
  • --precise – 如果没有这个选项, watch 间隔运行命令。 有了它,如果可能的话,每个命令的开始都会 这个时间间隔开始 。 如果在这个例子中没有指定这个选项,由于启动和执行命令( yourprog )所花费的时间,这个时间会晚一些,晚一些的时候会超过30秒。
  • yourprog – 要执行的程序或命令行。 如果命令行包含shell的特殊字符(例如空格或分号),则需要引用该字符。
  • >/dev/null – 大于 – 将正在运行的命令的输出redirect到文件/dev/null 。 该文件丢弃写入它的任何数据。 这样可以防止将输出写入屏幕,或者由于nohup正在使用,所以可以防止将输出发送到名为nohup.out的文件。
  • &watch命令在后台运行,控制返回到terminal或父进程。

请注意, nohup ,输出redirect和&后台控制操作符并不是特定要watch

以下是对yourprog脚本示例的说明:

  • date – 输出当前date和/或时间。 它也可以设置它们。
  • +%M.%S.%N – 这指定了使用date的输出格式。 %M是当前分钟, %S是当前秒, %N是当前纳秒。
  • >> yourprog.out – 这会将date命令的输出redirect到一个名为yourprog.out的文件。 double-than会导致输出在每次调用时被追加到文件中,而不是被覆盖的前一个内容。

克朗的devise是每分钟都会醒来,所以不可能在没有黑客攻击的情况下做到这一点,例如像你所说的睡觉。

 * * * * * /path/to/program * * * * * sleep 30; /path/to/program 

不要忘记在你的程序中写入一些东西,以便在以前的实例已经运行的情况下退出。

 #!/bin/sh if ln -s "pid=$$" /var/pid/myscript.pid; then trap "rm /var/pid/myscript.pid" 0 1 2 3 15 else echo "Already running, or stale lockfile." >&2 exit 1 fi 

当然,这仍然留下一个很小的失败的机会,所以search谷歌更适合您的环境的解决scheme。

你可以用第三方软件来做到这一点。

对我来说运行良好的一个选项是频繁使用cron

它允许毫秒的精度,它给你select推迟下一个执行,直到当前的退出。

我有几个担心:

(1)有时一个系统变得忙碌起来,无法准确地在30秒内启动一些事情,那么有可能在你同时运行一个工作的同时,另一个工作将会popup,然后你有两个(或更多)工作完成事情。 根据脚本,这里可能会有一些显着的干扰。 因此,在这样的脚本中编码应该包含一些代码,以确保只有一个给定的脚本实例同时运行。

(2)该脚本可能会有很多开销,并消耗比您想要的更多的系统资源。 如果您正在与许多其他系统活动竞争,则情况属实。

因此,正如一张海报所说的,在这种情况下,我会认真考虑放入一个运行额外进程的守护进程,以确保它在运行中至关重要的情况下保持运行。

一个解决scheme,如果它是你自己的脚本,或者如果你可以包装它:

  1. 获取并记住开始时间。
  2. 如果稍后将要触摸的locking文件存在且脚本尚未运行60秒,请稍等片刻,然后再次检查。 (例如while / sleep)*
  3. 如果locking文件在60秒过后仍然存在,请使用过期的locking警告退出。
  4. 触摸locking文件。
  5. 当脚本没有运行60秒时,将您的实际任务循环到所需的睡眠时间。
  6. 删除locking文件。
  7. 加上cron。
  8. 鲍勃是你的叔叔。

比构build和监视守护进程更令人头疼。

*如果您使用PHP,请记住clearstatcache()。

我最简单和最喜欢的解决scheme:

cron条目:
* * * * * flock -w0 /path/to/script /path/to/script

脚本:
while true;do echo doing something; sleep 10s;done

懒惰的替代::)

 * * * * * flock -w0 /path/to/log watch -n 10 echo doing >> /path/to/log