我可以每分钟更频繁地运行 cron 作业吗?

我可以每分钟更频繁地运行 cron 作业吗?

是否可以每 30 秒运行一次 cron 作业而不使用睡眠命令?

答案1

如果您的任务需要如此频繁地运行,那么 cron 就不适合您。除了它不会如此频繁地启动作业之外,如果作业的运行时间比启动间隔长,您还可能面临一些严重问题。重写您的任务以将其守护并持续运行,然后在必要时从 cron 启动它(同时确保如果它已经在运行,它不会重新启动)。

答案2

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

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

显示出相当好的精度水平。

以下是该命令各部分的解释:

  • nohupwatch-在这种情况下,当终端退出时,这会阻止后面的命令退出。
  • watchwatch- 此程序重复运行命令。通常每次运行命令时都会显示命令的第一屏输出。
  • -n 30- 运行命令的间隔。在本例中为每三十秒。
  • --precise- 如果没有此选项,则watch运行命令 间隔秒。有了它,每次启动命令开始 如果可能的话,间隔。如果示例中未指定此选项,则由于启动和执行命令所需的时间(yourprog),时间会越来越晚,每次晚 30 秒以上。
  • yourprog- 要执行的程序或命令行watch。如果命令行包含 shell 的特殊字符(例如空格或分号),则需要将其括起来。
  • >/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。双大于号会导致每次调用时将输出附加到文件,而不是覆盖以前的内容。

编辑

可能被滥用的另一个东西(或者可能是合法用途)是 systemd 计时器。

systemd/Timers 作为 cron 的替代品Cron 与 systemd 定时器

我将尽快发布一个例子。

答案3

* * * * * /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

当然,这仍然留下了非常小的失败机会,因此请通过谷歌搜索适合您环境的更好的解决方案。

答案4

您可以使用第三方软件来完成此操作。

对我来说效果很好的一个选择是频繁计划

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

相关内容