Running a cron every 30 seconds

后端 未结 19 972
面向向阳花
面向向阳花 2020-11-22 10:56

Ok so I have a cron that I need to run every 30 seconds.

Here is what I have:

*/30 * * * * /bin/bash -l -c \'cd /srv/last_song/releases/2012030813315         


        
相关标签:
19条回答
  • 2020-11-22 11:23

    You can't. Cron has a 60 sec granularity.

    * * * * * 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'\''
    
    0 讨论(0)
  • 2020-11-22 11:24

    Have a look at frequent-cron - it's old but very stable and you can step down to micro-seconds. At this point in time, the only thing that I would say against it is that I'm still trying to work out how to install it outside of init.d but as a native systemd service, but certainly up to Ubuntu 18 it's running just fine still using init.d (distance may vary on latter versions). It has the added advantage (?) of ensuring that it won't spawn another instance of the PHP script unless a prior one has completed, which reduces potential memory leakage issues.

    0 讨论(0)
  • 2020-11-22 11:24

    Run in a shell loop, example:

    #!/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
    
    0 讨论(0)
  • 2020-11-22 11:25

    If you are running a recent Linux OS with SystemD, you can use the SystemD Timer unit to run your script at any granularity level you wish (theoretically down to nanoseconds), and - if you wish - much more flexible launching rules than Cron ever allowed. No sleep kludges required

    It takes a bit more to set up than a single line in a cron file, but if you need anything better than "Every minute", it is well worth the effort.

    The SystemD timer model is basically this: timers are units that start service units when a timer elapses.

    So for every script/command that you want to schedule, you must have a service unit and then an additional timer unit. A single timer unit can include multiple schedules, so you normally wouldn't need more than one timer and one service.

    Here is a simple example that logs "Hello World" every 10 seconds:

    /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
    

    After setting up these units (in /etc/systemd/system, as described above, for a system-wide setting, or at ~/.config/systemd/user for a user-specific setup), you need to enable the timer (not the service though) by running systemctl enable --now helloworld.timer (the --now flag also starts the timer immediately, otherwise, it will only start after the next boot, or user login).

    The [Timer] section fields used here are as follows:

    • OnBootSec - start the service this many seconds after each boot.
    • OnUnitActiveSec - start the service this many seconds after the last time the service was started. This is what causes the timer to repeat itself and behave like a cron job.
    • AccuracySec - sets the accuracy of the timer. Timers are only as accurate as this field sets, and the default is 1 minute (emulates cron). The main reason to not demand the best accuracy is to improve power consumption - if SystemD can schedule the next run to coincide with other events, it needs to wake the CPU less often. The 1ms in the example above is not ideal - I usually set accuracy to 1 (1 second) in my sub-minute scheduled jobs, but that would mean that if you look at the log showing the "Hello World" messages, you'd see that it is often late by 1 second. If you're OK with that, I suggest setting the accuracy to 1 second or more.

    As you may have noticed, this timer doesn't mimic Cron all that well - in the sense that the command doesn't start at the beginning of every wall clock period (i.e. it doesn't start on the 10th second on the clock, then the 20th and so on). Instead is just happens when the timer ellapses. If the system booted at 12:05:37, then the next time the command runs will be at 12:05:47, then at 12:05:57, etc. If you are interested in actual wall clock accuracy, then you may want to replace the OnBootSec and OnUnitActiveSec fields and instead set an OnCalendar rule with the schedule that you want (which as far as I understand can't be faster than 1 second, using the calendar format). The above example can also be written as:

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

    Last note: as you probably guessed, the helloworld.timer unit starts the helloworld.service unit because they have the same name (minus the unit type suffix). This is the default, but you can override that by setting the Unit field for the [Timer] section.

    More gory details can be found at:

    • Arch Linux Wiki page about SystemD timers which gives a very good overview of the topic, with examples.
    • man systemd.timer
    • man systemd.time
    • man systemd.service
    • man system.exec
    0 讨论(0)
  • 2020-11-22 11:27

    You can check out my answer to this similar question

    Basically, I've included there a bash script named "runEvery.sh" which you can run with cron every 1 minute and pass as arguments the real command you wish to run and the frequency in seconds in which you want to run it.

    something like this

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

    0 讨论(0)
  • 2020-11-22 11:29

    write one shell script create .sh file

    nano every30second.sh

    and write script

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

    then set cron for this script crontab -e

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

    this cron call .sh file in every 1 min & in the .sh file command is run 2 times in 1 min

    if you want run script for 5 seconds then replace 30 by 5 and change for loop like this: For (( i=1; i <= 12; i++ ))

    when you select for any second then calculate 60/your second and write in For loop

    0 讨论(0)
提交回复
热议问题