好的,我有一个cron,我需要每30秒运行一次 .
这是我有的:
*/30 * * * * /bin/bash -l -c 'cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\'''
它运行,但这是每30分钟还是30秒运行一次?
此外,我一直在阅读如果我经常运行它,cron可能不是最好的工具 . 还有其他更好的工具,我可以在Ubuntu 11.04上使用或安装,这将是一个更好的选择吗?有没有办法修复上面的cron?
16 回答
您在分钟说明符中有
*/30
- 这意味着每分钟但步长为30(换句话说,每半小时) . 由于cron
不会达到亚分钟分辨率,因此您需要找到另一种方法 .一种可能性,虽然它有点像kludge,但是有两个工作,一个偏移30秒:
两个cron作业实际上每分钟运行一次,但后者将在执行"meat"之前等待半分钟
/path/to/executable
.你不能 . Cron的粒度为60秒 .
Cron的粒度只需几分钟,并不是为了每隔_1731718秒唤醒一次 . 在循环中运行重复任务,它应该做你需要的:
不需要两个cron条目,你可以把它放在一个:
所以在你的情况下:
* * * * * /bin/bash -l -c "cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\'' ; sleep 30 ; cd /srv/last_song/releases/20120308133159 && script/rails runner -e production '\''Song.insert_latest'\''"
你可以看看我对this similar question的回答
基本上,我在那里添加了一个名为“runEvery.sh”的bash脚本,你可以每隔1分钟用cron运行一次,并将你希望运行的实际命令和你想要运行它的频率作为参数传递 .
这样的事情
* * * * * ~/bin/runEvery.sh 5 myScript.sh
Cron作业不能用于在几秒钟内安排作业 . 即你不能安排一个cron作业每5秒运行一次 . 另一种方法是编写一个在其中使用
sleep 5
命令的shell脚本 .使用bash while循环创建一个shell脚本every-5-seconds.sh,如下所示 .
现在,使用
nohup
在后台执行此shell脚本,如下所示 . 即使您从会话中注销,这也将继续执行脚本 . 这将每5秒执行一次backup.sh shell脚本 .使用 Watch :
在dir
/etc/cron.d/
新建一个文件
excute_per_30s
将每30秒运行一次cron
使用fcron(http://fcron.free.fr/) - 以秒为单位提供粒度,比cron(vixie-cron)更好,功能更丰富,也更稳定 . 我曾经制作过愚蠢的事情,例如在一台机器上运行非常愚蠢的设置运行大约60个PHP脚本,它仍然可以完成它的工作!
Crontab作业可用于以分钟/小时/天计划作业,但不能在几秒钟内计划 . 替代方案:
创建一个每30秒执行一次的脚本:
使用
crontab -e
和crontab执行此脚本:谢谢你们所有的好答案 . 为了简单起见,我喜欢混合解决方案,使用crontab上的控件和脚本上的时分 . 所以这就是我每隔20秒(每分钟三次)运行一个脚本所做的 . Crontab线:
脚本:
我只是有类似的任务要做,并使用以下方法:
我需要每隔30秒定期杀死-3(以获得程序的堆栈跟踪)几个小时 .
这是为了确保如果我松开外壳(网络问题,Windows崩溃等等),我不会丢失 Watch 的执行
编写一个shell脚本创建.sh文件
nano every30second.sh
并编写脚本
然后为此脚本设置cron crontab -e
(* * * * * /home/username/every30second.sh)
这个cron调用.sh文件每1分钟和.sh文件命令在1分钟内运行2次
如果你想运行脚本5秒钟然后将30替换为5并改变循环,如下所示:
For (( i=1; i <= 12; i++ ))
当你选择任何一秒然后计算60 /你的秒并写入For循环
目前我正在使用以下方法 . 没有问题 .
如果你想每运行 N 秒,那么 X 将是 60/N 而 Y 将是 N .
谢谢 .
如果您使用SystemD运行最近的Linux操作系统,您可以使用SystemD Timer单元以您希望的任何粒度级别(理论上低至纳秒)运行您的脚本,并且 - 如果您愿意 - 比Cron允许的更灵活的启动规则 . No sleep kludges required
设置比cron文件中的单行要多一些,但如果你需要比“每分钟”更好的东西,那么值得付出努力 .
该SystemD计时器模型基本上是这样的 - 计时器是在计时器过去时启动服务单元的单元 .
因此,对于要安排的每个脚本/命令,您必须具有服务单元,然后是其他计时器单元 . 单个计时器单元可以包含多个计划,因此您通常不需要多个计时器和一个服务 .
这是一个每10秒记录一次“Hello World”的简单示例:
/etc/systemd/system/helloworld.service
:/etc/systemd/system/helloworld.timer
:设置这些单元后(如
/etc/systemd/system
,如上所述,对于系统范围的设置,或在~/.config/systemd/user
进行用户特定设置),您需要通过运行systemctl enable helloworld.timer
来启用计时器(不是服务) . 如果要立即启动计时器(而不是在重新启动后等待它启动),也要运行systemctl start helloworld.timer
.此处使用的
[Timer]
部分字段如下:OnBootSec
- 每次启动后多秒启动服务 .OnUnitActiveSec
- 在上次启动服务后的几秒钟内启动服务 . 这就是导致计时器重复并且表现得像cron作业的原因 .AccuracySec
- 设置计时器的准确性 . 定时器仅与此字段集一样准确,默认值为1分钟(模拟cron) . 不要求最佳精度的主要原因是提高功耗 - 如果SystemD可以安排下一次运行与其他事件一致,则需要更少地唤醒CPU . 上面示例中的1ms
并不理想 - 我通常在我的子分钟预定作业中将精度设置为1
(1秒),但这意味着如果您查看显示"Hello World"消息的日志,那么'd see that it is often late by 1 second. If you'就可以了,我建议将精度设置为1秒或更长 .您可能已经注意到,此计时器不会在每个挂钟时段的开始处开始(即,它不会在时钟的第10秒开始,然后是20,依此类推) . 相反,只是在计时器瘫痪时发生 . 如果系统在12:05:37启动,则下次命令运行时间为12:05:47,然后是12:05:57等 . 如果您对实际挂钟精度感兴趣,那么您可以想要替换
OnBootSec
和OnUnitActiveSec
字段,而是使用您想要的计划设置OnCalendar
规则(根据我的理解,使用日历格式不能超过1秒) . 上面的例子也可以写成:最后注意:正如您可能猜到的那样,
helloworld.timer
单元启动helloworld.service
单元,因为它们具有相同的名称(减去单元类型后缀) . 这是默认设置,但您可以通过为[Timer]
部分设置Unit
字段来覆盖它 .更多血腥细节可在以下网址找到:
Arch Linux Wiki page about SystemD timers通过示例给出了非常好的主题概述 .
man systemd.timer
man systemd.time
man systemd.service
man system.exec
在shell循环中运行,例如: