How to get a unix script to run every 15 seconds?

前端 未结 9 581
佛祖请我去吃肉
佛祖请我去吃肉 2020-11-28 19:35

I\'ve seen a few solutions, including watch and simply running a looping (and sleeping) script in the background, but nothing has been ideal.

I have a script that ne

相关标签:
9条回答
  • 2020-11-28 20:12

    To avoid possible overlapping of execution, use a locking mechanism as described in that thread.

    0 讨论(0)
  • 2020-11-28 20:15
    #! /bin/sh
    
    # Run all programs in a directory in parallel
    # Usage: run-parallel directory delay
    # Copyright 2013 by Marc Perkel
    # docs at http://wiki.junkemailfilter.com/index.php/How_to_run_a_Linux_script_every_few_seconds_under_cron"
    # Free to use with attribution
    
    if [ $# -eq 0 ]
    then
       echo
       echo "run-parallel by Marc Perkel"
       echo
       echo "This program is used to run all programs in a directory in parallel" 
       echo "or to rerun them every X seconds for one minute."
       echo "Think of this program as cron with seconds resolution."
       echo
       echo "Usage: run-parallel [directory] [delay]"
       echo
       echo "Examples:"
       echo "   run-parallel /etc/cron.20sec 20"
       echo "   run-parallel 20"
       echo "   # Runs all executable files in /etc/cron.20sec every 20 seconds or 3 times a minute."
       echo 
       echo "If delay parameter is missing it runs everything once and exits."
       echo "If only delay is passed then the directory /etc/cron.[delay]sec is assumed."
       echo
       echo 'if "cronsec" is passed then it runs all of these delays 2 3 4 5 6 10 12 15 20 30'
       echo "resulting in 30 20 15 12 10 6 5 4 3 2 executions per minute." 
       echo
       exit
    fi
    
    # If "cronsec" is passed as a parameter then run all the delays in parallel
    
    if [ $1 = cronsec ]
    then
       $0 2 &
       $0 3 &
       $0 4 &
       $0 5 &
       $0 6 &
       $0 10 &
       $0 12 &
       $0 15 &
       $0 20 &
       $0 30 &
       exit
    fi
    
    # Set the directory to first prameter and delay to second parameter
    
    dir=$1
    delay=$2
    
    # If only parameter is 2,3,4,5,6,10,12,15,20,30 then automatically calculate 
    # the standard directory name /etc/cron.[delay]sec
    
    if [[ "$1" =~ ^(2|3|4|5|6|10|12|15|20|30)$ ]]
    then
       dir="/etc/cron.$1sec"
       delay=$1
    fi
    
    # Exit if directory doesn't exist or has no files
    
    if [ ! "$(ls -A $dir/)" ]
    then
       exit
    fi
    
    # Sleep if both $delay and $counter are set
    
    if [ ! -z $delay ] && [ ! -z $counter ]
    then
       sleep $delay
    fi
    
    # Set counter to 0 if not set
    
    if [ -z $counter ]
    then
       counter=0
    fi
    
    # Run all the programs in the directory in parallel
    # Use of timeout ensures that the processes are killed if they run too long
    
    for program in $dir/* ; do
       if [ -x $program ] 
       then
          if [ "0$delay" -gt 1 ] 
          then
             timeout $delay $program &> /dev/null &
          else
             $program &> /dev/null &
          fi
       fi
    done
    
    # If delay not set then we're done
    
    if [ -z $delay ]
    then
       exit
    fi
    
    # Add delay to counter
    
    counter=$(( $counter + $delay ))
    
    # If minute is not up - call self recursively
    
    if [ $counter -lt 60 ]
    then
       . $0 $dir $delay &
    fi
    
    # Otherwise we're done
    
    0 讨论(0)
  • 2020-11-28 20:21

    Use nanosleep(2). It uses structure timespec that is used to specify intervals of time with nanosecond precision.

    struct timespec {
               time_t tv_sec;        /* seconds */
               long   tv_nsec;       /* nanoseconds */
           };
    
    0 讨论(0)
提交回复
热议问题