是否可以在没有睡眠命令的情况下每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秒。 yourprog
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 / 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
命令