it-swarm.cn

我可以比每分钟更频繁地执行Cron工作吗?

是否可以在没有睡眠命令的情况下每30秒运行一次cron作业?

48
user15336

如果您的任务需要经常运行,那么cron是错误的工具。除了它根本不会频繁启动作业之外,如果作业运行的时间长于两次启动之间的间隔,您还可能会面临一些严重的问题。重写您的任务以使其守护进程持续运行,然后在必要时从cron启动它(同时确保它已经运行时不会重新启动)。

38
duskwuff -inactive-

Linux命令的最具创造力misuse的候选人:

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

如果yourprog包含:

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-在终端退出时,它后面的命令watch不会退出。
  • watch -该程序反复运行命令。通常,每次watch运行命令时,都会显示该命令的第一屏输出。
  • -n 30-运行命令的间隔。在这种情况下,每三十秒一次。
  • --precise-没有此选项,watch运行命令afterinterval秒。有了它,命令的每个开始beginson如果可能的话。如果在示例中未指定此选项,则由于启动和执行命令(yourprog)所花费的时间,时间每次都会越来越晚,超过30秒。
  • yourprog-要执行watch的程序或命令行。如果命令行包含命令行管理程序专用的字符(例如空格或分号),则需要用引号引起来。
  • >/dev/null-大于号将watch正在运行的命令的输出重定向到文件/dev/null。该文件将丢弃写入其中的所有数据。这样可以防止将输出写入屏幕,或者由于正在使用Nohup,因此可以防止将输出发送到称为Nohup.out的文件。
  • &-watch命令在后台运行,并且控制权返回到终端或父进程。

请注意,Nohup,输出的重定向和&后台控制运算符并不特定于watch

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

  • date-输出当前日期和/或时间。它也可以设置它们。
  • +%M.%S.%N-这指定date使用的输出格式。 %M是当前分钟,%S是当前秒,%N是当前纳秒。
  • >> yourprog.out-这将date命令的输出重定向到名为yourprog.out的文件。大于等于double导致在每次调用时将输出附加到文件,而不是覆盖先前的内容。

编辑

可能会被滥用的另一件事(或可能是合法用途)是systemd计时器。

请参阅 systemd/Timer作为cron替代品Cron与systemd定时器

我将尽快发布一个示例。

39

Cron被设计为每分钟都会醒来,因此如果没有一些黑客攻击(例如像您提到的那样睡觉)就不可能做到。

14
Balázs Pozsár
* * * * * /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

当然,这仍然留下了很小的失败机会,因此请在google中搜索适用于您的环境的更好的解决方案。

13
ghoti

您可以使用第三方软件执行此操作。

一个对我来说效果很好的选项是 frequent-cron

它允许毫秒精度,并且使您可以选择推迟下一次执行,直到当前执行退出为止。

8
thatjuan

我有几个问题:

(1)有时系统忙碌而无法在30秒点上准确启动一切,那么有可能同时运行一个作业而弹出另一个作业,然后您有2个(或更多)作业在执行事情。根据脚本的不同,此处可能会有一些重大干扰。因此,在这样的脚本中编码应包含一些代码,以确保给定脚本的仅一个实例在同一时间运行。

(2)该脚本可能会有很多开销,并且消耗比您所需更多的系统资源。如果您要与许多其他系统活动竞争,那么这是正确的。

因此,正如一位发布者所言,在这种情况下,我将认真考虑放入一个运行有其他进程的守护程序,以确保该守护程序在对您的操作至关重要的情况下仍可运行。

2
mdpc

我最简单,最喜欢的解决方案:

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

要么

* * * * * flock -w0 /path/to/log watch -n 10 /path/to/script

优点

  • 使用flock命令可避免同时由多个实例运行脚本。在大多数情况下,这可能非常重要。
  • 在大多数Linux安装中都可以使用flockwatch命令

缺点

  • 停止这种“服务”需要两个步骤
    • 注释掉cron条目
    • 杀死脚本或watch命令
1
asvany

一个解决方案,如果是用于您自己的脚本或可以包装的话:

  1. 获取并记住开始时间。
  2. 如果存在您稍后将要触摸的锁定文件,并且脚本未运行60秒钟,请稍等片刻,然后再次检查。 (例如,当/在睡觉时)*
  3. 如果60秒钟后仍存在锁定文件,请退出并显示陈旧的锁定警告。
  4. 触摸锁定文件。
  5. 当脚本未运行60秒钟时,请以所需的睡眠时间循环实际任务。
  6. 删除锁定文件。
  7. 加入每分钟cron。
  8. 鲍勃是你的叔叔。

与构建和监视守护程序相比,它更让人头疼。

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

0
Someone