简体   繁体   中英

How to automatically run a long list of time-dependent CRON jobs?

I'm hoping to run a list of CRON jobs based on TZ=America/New_York , and avoid setting CRON jobs manually (line by line), since my CRON jobs are increasing and I will also have PHP scripts that should run every minute to get data from an API.

This is my [first] pseudo bash script attempt, which should surely have several problems, and it does not seem be right to do so.

  • How to make a list of time-dependent CRON jobs automated?

  • What are the alternatives to manual CRON job setting and testing?

  • Maybe, would it be best/possible to write a PHP file with all my CRON jobs and then set one CRON job to run that PHP file?

Pseudo Bash Script

#!/bin/bash

# There are three times that CRON jobs should be running:
# During pre-market exchanges
# During normal market hours
# During after hours or post-market exchanges

export TZ=America/New_York
server_name="$USER"

##Runs on live server
if [[ server_name=="em" ]]; then
    echo "CRON jobs only run on live servers 💛";
    exit
fi

#Market times: Before Premarket, Pre-market, Normal Market hours, Post-Market, After post market
pre_market_open=03:00
start_normal_market=09:00
end_normal_market=17:00
post_market_close=21:00

current_time=$(date '+%H:%M')
# current_time=5:23

#Read variables
IFS=: read hour_pre_market_open min_pre_market_open <<< "$pre_market_open"
IFS=: read hour_start_normal_market min_start_normal_market <<< "$start_normal_market"
IFS=: read hour_end_normal_market min_end_normal_market <<< "$end_normal_market"
IFS=: read hour_post_market_close min_post_market_close <<< "$post_market_close"
IFS=: read hour_current_time min_current_time <<< "$current_time"

#Calculate total minutes 
total_pre_market_open_min=$((10#$hour_pre_market_open*60 + 10#$min_pre_market_open))
total_start_normal_market_min=$((10#$hour_start_normal_market*60 + 10#$min_start_normal_market))
total_end_normal_market_min=$((10#$hour_end_normal_market*60 + 10#$min_end_normal_market))
total_post_market_close_min=$((10#$hour_post_market_close*60 + 10#$min_post_market_close))

total_current_time_min=$((10#$hour_current_time*60 + 10#$min_current_time))

# This function should be run during pre-market before market opens
function runCronDuringPreMarket(){
    0   0   1   1   *   sleep 19; rm -rf /home2/usco/master/blog-back/sectors >/dev/null 2>&1; wait
    3   *   *   *   *   sleep 27; rm -rf /home2/usco/master/cache >/dev/null 2>&1; wait
    6   */3 *   *   *   sleep 48; /usr/bin/php -q /home2/usco/master/cron/post/TweetUSCO.php >/dev/null 2>&1; wait
    9   *   *   *   *   sleep 12; /usr/bin/php -q /home2/usco/master/cron/equity/EQ.php >/dev/null 2>&1; wait
    echo "CRON jobs success 💚"
}

# This function should be run during normal market hours
function runCronDuringNormalMarket(){
    12  0   1   1   *   sleep 19; rm -rf /home2/usco/master/blog-back/sectors >/dev/null 2>&1; wait
    20  *   *   *   *   sleep 27; rm -rf /home2/usco/master/cache >/dev/null 2>&1; wait
    27  */3 *   *   *   sleep 48; /usr/bin/php -q /home2/usco/master/cron/post/TweetUSCO.php >/dev/null 2>&1; wait
    23,57   *   *   *   *   sleep 12; /usr/bin/php -q /home2/usco/master/cron/equity/EQ.php >/dev/null 2>&1; wait
    echo "CRON jobs success 💚"
}

# This function should be run after the market closes during post market 
function runCronDuringPostMarket(){
    29  0   1   1   *   sleep 19; rm -rf /home2/usco/master/blog-back/sectors >/dev/null 2>&1; wait
    37  *   *   *   *   sleep 27; rm -rf /home2/usco/master/cache >/dev/null 2>&1; wait
    58  */3 *   *   *   sleep 48; /usr/bin/php -q /home2/usco/master/cron/post/TweetUSCO.php >/dev/null 2>&1; wait
    3   *   *   *   *   sleep 12; /usr/bin/php -q /home2/usco/master/cron/equity/EQ.php >/dev/null 2>&1; wait
    echo "CRON jobs success 💚"
}

# This case should break based on total current time minutes 
case "$total_current_time_min" in
    before_premarket) "$total_current_time_min" -lt "$total_pre_market_open_min"; break;; 
    during_pre_market) "$total_current_time_min" -lt "total_start_normal_market_min"; runCronDuringPreMarket; wait; break;; 
    during_normal_market) "$total_current_time_min" -lt "$total_pre_market_open_min"; runCronDuringNormalMarket; wait; break;;
    during_postmarket) "$total_current_time_min" -lt "$diff_postmarket_to_end"; runCronDuringPostMarket; wait; break;;
    after_postmarket) break;;
esac

Specifications

  • PHP7.1
  • cPanel 78.0.18

Cron schedule strings (29 0 1 1 *) are not understood by bash. You could try to write something to parse them and decide to do something when the current time matches the pattern... but that's what Cron already does.

Don't use bash for this; use Cron.

See also crontab run every 15 minutes between certain hours

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM