Reputation: 27723
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?
#!/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
Upvotes: 0
Views: 483
Reputation:
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
Upvotes: 3