首页 文章

每30秒运行一次cron

提问于
浏览
207

好的,我有一个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 回答

  • 21

    您在分钟说明符中有 */30 - 这意味着每分钟但步长为30(换句话说,每半小时) . 由于 cron 不会达到亚分钟分辨率,因此您需要找到另一种方法 .

    一种可能性,虽然它有点像kludge,但是有两个工作,一个偏移30秒:

    * * * * * /path/to/executable param1 param2
    * * * * * ( sleep 30 ; /path/to/executable param1 param2 )
    

    两个cron作业实际上每分钟运行一次,但后者将在执行"meat"之前等待半分钟 /path/to/executable .

  • 0

    你不能 . Cron的粒度为60秒 .

    * * * * * 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'\''
    
  • 4

    Cron的粒度只需几分钟,并不是为了每隔_1731718秒唤醒一次 . 在循环中运行重复任务,它应该做你需要的:

    #!/bin/env bash
    while [ true ]; do
     sleep 30
     # do what you need to here
    done
    
  • 6

    不需要两个cron条目,你可以把它放在一个:

    * * * * * /bin/bash -l -c "/path/to/executable; sleep 30 ; /path/to/executable"
    

    所以在你的情况下:

    * * * * * /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'\''"

  • 549

    你可以看看我对this similar question的回答

    基本上,我在那里添加了一个名为“runEvery.sh”的bash脚本,你可以每隔1分钟用cron运行一次,并将你希望运行的实际命令和你想要运行它的频率作为参数传递 .

    这样的事情

    * * * * * ~/bin/runEvery.sh 5 myScript.sh

  • 6

    Cron作业不能用于在几秒钟内安排作业 . 即你不能安排一个cron作业每5秒运行一次 . 另一种方法是编写一个在其中使用 sleep 5 命令的shell脚本 .

    使用bash while循环创建一个shell脚本every-5-seconds.sh,如下所示 .

    $ cat every-5-seconds.sh
    #!/bin/bash
    while true
    do
     /home/ramesh/backup.sh
     sleep 5
    done
    

    现在,使用 nohup 在后台执行此shell脚本,如下所示 . 即使您从会话中注销,这也将继续执行脚本 . 这将每5秒执行一次backup.sh shell脚本 .

    $ nohup ./every-5-seconds.sh &
    
  • 1

    使用 Watch :

    $ watch --interval .30 script_to_run_every_30_sec.sh
    
  • 10

    在dir /etc/cron.d/

    新建一个文件 excute_per_30s

    * * * * * yourusername  /bin/date >> /home/yourusername/temp/date.txt
    * * * * * yourusername sleep 30; /bin/date >> /home/yourusername/temp/date.txt
    

    将每30秒运行一次cron

  • 4

    使用fcron(http://fcron.free.fr/) - 以秒为单位提供粒度,比cron(vixie-cron)更好,功能更丰富,也更稳定 . 我曾经制作过愚蠢的事情,例如在一台机器上运行非常愚蠢的设置运行大约60个PHP脚本,它仍然可以完成它的工作!

  • 35

    Crontab作业可用于以分钟/小时/天计划作业,但不能在几秒钟内计划 . 替代方案:

    创建一个每30秒执行一次的脚本:

    #!/bin/bash
    # 30sec.sh
    
    for COUNT in `seq 29` ; do
      cp /application/tmp/* /home/test
      sleep 30
    done
    

    使用 crontab -e 和crontab执行此脚本:

    * * * * * /home/test/30sec.sh > /dev/null
    
  • 0

    谢谢你们所有的好答案 . 为了简单起见,我喜欢混合解决方案,使用crontab上的控件和脚本上的时分 . 所以这就是我每隔20秒(每分钟三次)运行一个脚本所做的 . Crontab线:

    * * * * 1-6 ./a/b/checkAgendaScript >> /home/a/b/cronlogs/checkAgenda.log
    

    脚本:

    cd /home/a/b/checkAgenda
    
    java -jar checkAgenda.jar
    sleep 20
    java -jar checkAgenda.jar 
    sleep 20
    java -jar checkAgenda.jar
    
  • -2

    我只是有类似的任务要做,并使用以下方法:

    nohup watch -n30 "kill -3 NODE_PID" &
    

    我需要每隔30秒定期杀死-3(以获得程序的堆栈跟踪)几个小时 .

    nohup ... &
    

    这是为了确保如果我松开外壳(网络问题,Windows崩溃等等),我不会丢失 Watch 的执行

  • 0

    编写一个shell脚本创建.sh文件

    nano every30second.sh

    并编写脚本

    #!/bin/bash
    For  (( i=1; i <= 2; i++ ))
    do
        write Command here
        sleep 30
    done
    

    然后为此脚本设置cron crontab -e

    (* * * * * /home/username/every30second.sh)

    这个cron调用.sh文件每1分钟和.sh文件命令在1分钟内运行2次

    如果你想运行脚本5秒钟然后将30替换为5并改变循环,如下所示: For (( i=1; i <= 12; i++ ))

    当你选择任何一秒然后计算60 /你的秒并写入For循环

  • 8

    目前我正在使用以下方法 . 没有问题 .

    * * * * * /bin/bash -c ' for i in {1..X}; do YOUR_COMMANDS ; sleep Y ; done '
    

    如果你想每运行 N 秒,那么 X 将是 60/NY 将是 N .

    谢谢 .

  • 52

    如果您使用SystemD运行最近的Linux操作系统,您可以使用SystemD Timer单元以您希望的任何粒度级别(理论上低至纳秒)运行您的脚本,并且 - 如果您愿意 - 比Cron允许的更灵活的启动规则 . No sleep kludges required

    设置比cron文件中的单行要多一些,但如果你需要比“每分钟”更好的东西,那么值得付出努力 .

    该SystemD计时器模型基本上是这样的 - 计时器是在计时器过去时启动服务单元的单元 .

    因此,对于要安排的每个脚本/命令,您必须具有服务单元,然后是其他计时器单元 . 单个计时器单元可以包含多个计划,因此您通常不需要多个计时器和一个服务 .

    这是一个每10秒记录一次“Hello World”的简单示例:

    /etc/systemd/system/helloworld.service

    [Unit]
    Description=Say Hello
    [Service]
    ExecStart=/usr/bin/logger -i Hello World
    

    /etc/systemd/system/helloworld.timer

    [Unit]
    Description=Say Hello every 10 seconds
    [Timer]
    OnBootSec=10
    OnUnitActiveSec=10
    AccuracySec=1ms
    [Install]
    WantedBy=timers.target
    

    设置这些单元后(如 /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等 . 如果您对实际挂钟精度感兴趣,那么您可以想要替换 OnBootSecOnUnitActiveSec 字段,而是使用您想要的计划设置 OnCalendar 规则(根据我的理解,使用日历格式不能超过1秒) . 上面的例子也可以写成:

    OnCalendar=*-*-* *:*:00,10,20,30,40,50
    

    最后注意:正如您可能猜到的那样, helloworld.timer 单元启动 helloworld.service 单元,因为它们具有相同的名称(减去单元类型后缀) . 这是默认设置,但您可以通过为 [Timer] 部分设置 Unit 字段来覆盖它 .

    更多血腥细节可在以下网址找到:

  • 0

    在shell循环中运行,例如:

    #!/bin/sh    
    counter=1
    while true ; do
     echo $counter
     counter=$((counter+1))
     if [[ "$counter" -eq 60 ]]; then
      counter=0
     fi
     wget -q http://localhost/tool/heartbeat/ -O - > /dev/null 2>&1 &
     sleep 1
    done
    

相关问题