是否可以在没有睡眠命令的情况下每30秒运行一次cron作业?
是否可以在没有睡眠命令的情况下每30秒运行一次cron作业?
Answers:
如果您的任务需要经常运行,那么cron是错误的工具。除了它根本不会频繁启动作业外,如果作业运行的时间比两次启动之间的间隔长,那么您还可能会面临一些严重的问题。重写您的任务以使其守护进程持续运行,然后在必要时从cron启动它(同时确保它已经运行时不会重新启动)。
run-one用来确保程序甚至PHP脚本都不会启动重复的实例。sudo apt-get install run-one并致电run-one <normal command>
最有创意地 滥用 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运行命令。有了它,命令的每个开始都尽可能在间隔上开始。如果在示例中未指定此选项,由于启动和执行命令()所花费的时间,每次的时间将越来越晚,超过30秒。 yourprogyourprog- 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 / Timers作为cron的替代品,以及Cron vs systemd计时器。
我将尽快发布一个示例。
&导致该命令在后台运行,控制返回到紧接在命令提示。使用该nohup命令会使后台进程(在这种情况下为watch)忽略在shell退出(例如关闭终端)时发送的挂断信号。...
>/dev/null会导致输出被丢弃,并阻止创建一个nohup.out文件,否则将在标准输出为终端时创建该文件。
sleep,则需要编写一个循环,以便重复该过程(watch对您来说也是重复一次cron)。您仍然需要nohup和&。另一个问题sleep是时间漂移。该--precise的选项watch避免了这一点。如果没有它或sleep在循环中使用,则在时间间隔中加上了要运行的命令或脚本所花费的时间,因此每次运行的时间都晚于……
Cron被设计为每分钟都会醒来,因此如果没有一些黑客攻击(例如像您提到的那样睡觉)是不可能做到的。
* * * * * /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以找到适用于您的环境的更好的解决方案。
without a sleep command
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命令避免了同时在多个实例中运行脚本。在大多数情况下,这可能非常重要。flock和watch命令可用于大多数Linux安装watch命令