是否有可能每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,如果它是你自己的脚本,或者如果你可以包装它:
比构build和监视守护进程更令人头疼。
*如果您使用PHP,请记住clearstatcache()。
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