是否可以每 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
显示出相当好的精度水平。
以下是该命令各部分的解释:
nohup
watch
-在这种情况下,当终端退出时,这会阻止后面的命令退出。watch
watch
- 此程序重复运行命令。通常每次运行命令时都会显示命令的第一屏输出。-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
当然,这仍然留下了非常小的失败机会,因此请通过谷歌搜索适合您环境的更好的解决方案。