Cron Job running every other Tuesday - date

Im having some difficulty with this cron job. Running a job at 6:15PM every otherTuesday during March, June, September and December
What I have so far 15 18 1 3,6,9,12 2

Have a cron schedule for every Tuesday, and then make sure in the command that it only runs every other time. For example, we can use the date command to get the number of the week, so we can check if that week number is even.
15 18 * 3,6,9,12 2 [ $((`date +%V`%2)) -eq 0 ] && your_command
(untested)

Related

Cron expression for biweekly jobs in Rundeck

I am trying to look for cron expression to schedule a job every alternate Mondays at 12 PM. I am using Rundeck to schedule my jobs.
How do i create an expression that runs a job like this ?
1st Run => 01-July-2019 [Monday] 12:00 PM
2nd Run => 15-July-2019 [Monday] 12:00 PM
3rd Run => 29-July-2019 [Monday] 12:00 PM
You need another "verifier" job (using Rundeck API) that modifies the first at every alternate, here you have a good example: https://github.com/G3NSVRV/Rundeck-Scripts/tree/master/ProjectExamples/ConditionalCron (take a look from line 39 to 50 in "Cron.xml" file).

How to run Batch Job EST 1:00 AM everyday?

In salesforce is there any way to run the Batch Job midnight at EST time everyday ?
I know following cron runs everyday at 1:00 AM. But not sure on which timezone will it run ?
Cron format ==>
0 0 1 1/1 * ? *
I dont see a way to configure the timezone actually. Any way ?
System.schedule('TSAMPLE Job1', '0 0 1 1/1 * ? *', new My_Scheduler());
Like mentioned here:
Apex Scheduler the The System.Schedule method uses the user's timezone for the basis of all schedules.
Hope this helps.

Get date of last saturday - BusyBox 1.1.0

Since the date in BusyBox is not as powerful as gnu date, I have problems to calculate the date of last saturday.
last_sat=`date +"%Y-%m-%d" -d "last saturday"`
only works fine with gnu date.
I've found something like this to calculate from Epoch
busybox date -D '%s' -d "$(( `busybox date +%s`+3*60 ))"
but my BusyBox (v1.1.0) doesn't recognize the -D argument.
Any suggestions?
For the last Saturday before today, under busybox 1.16:
date -d "UTC 1970-01-01 $(date +"%s - 86400 - %w * 86400"|xargs expr) secs"
How it works: take the current date in seconds, subtract one day, subtract one day times the number of the current weekday, then convert those seconds back to a date.
EDIT: after hacking together a build of 1.1, this works:
date -d "1970.01.01-00:00:$(date +"%s - 86400 - %w * 86400"|xargs expr)"
This working version is based on code-reading:
} else if (t = *tm_time, sscanf(t_string, "%d.%d.%d-%d:%d:%d", &t.tm_year,
&t.tm_mon, &t.tm_mday,
&t.tm_hour, &t.tm_min,
&t.tm_sec) == 6) {
t.tm_year -= 1900; /* Adjust years */
t.tm_mon -= 1; /* Adjust dates from 1-12 to 0-11 */
BusyBox's date command has been the topic of some discussion over the years. Apparently it doesn't always work as documented, and it doesn't always work the same as previous versions.
On a BB system I administer running BusyBox v1.01, I'm able to use the -d option with dates in the format MMDDhhmmYYYY.ss, and in no other format that I've tried. Luckily, output formats work as expected, presumably because date is using a proper strftime() according to comments in the source.
Here's my forward-and-reverse example:
[~] # busybox date '+%m%d%H%M%Y.%S'
090500152016.41
[~] # busybox date -d 090500152016.41
Mon Sep 5 00:15:41 EDT 2016
So .. what can we do with this? It seems that we can't do an arbitrary adjustment of seconds, as it only reads the first two digits:
[~] # busybox date -d 123119001969.65 '+%s'
65
[~] # busybox date -d 123119001969.100 '+%s'
10
Well, it turns out you can load the date fields with "invalid" numbers.
[~] # busybox date 090100002016
Thu Sep 1 00:00:00 EDT 2016
[~] # busybox date 093400002016
Wed Oct 4 00:00:00 EDT 2016
[~] # busybox date 09-200002016
Mon Aug 29 00:00:00 EDT 2016
So let's adjust the "day" field using something based on %w.
today=$(busybox date '+%m%d%H%M%Y')
last_sat=$(busybox date -d "${today:0:2}$( printf '%02d' $(( 10#${today:2:2} - 1 - $(busybox date '+%w') )) )${today:4}" '+%F')
This simply subtracts numbers in the second field (the 3rd and 4th characters of the date string). It obviously requires that your shell either be bash or understand bash-style math notation ($((...))). Math-wise, it should work as long as "last saturday" is within the same month, and it MAY work (I haven't tested it) with rollvers to the previous month (per the last test above).
Rather than jumping through these burning hoops, I recommend you just install a GNU date binary, and don't use busybox for this one binary. :-P
Good luck!

Cronjob Pausing between 00:00 and 01:00

I know, there are many contents about cronjob. But i'm uncertain.
I need a Cron that run all 5 minutes. This Cron shouldn't run between 00:00 and 01:00 (in the night)
My cron
*/5 01-23 * * * balbalabalabal > aaa
Is this right?
Running this cron at 23.05, 23.10....23.55 and start again at 01:00?
best regards!
Ok I tested this.
The Cron runs at 23.05, 23.10..... until 23.55.
Then pausing and the first Cronjob start again at 01.00

How to check if today is a weekend in bash?

How to check if today is a weekend using bash or even perl?
I want to prevent certain programs to run on a weekend.
You can use something like:
if [[ $(date +%u) -gt 5 ]]; then echo weekend; fi
date +%u gives you the day of the week from Monday (1) through to Sunday (7). If it's greater than 5 (Saturday is 6 and Sunday is 7), then it's the weekend.
So you could put something like this at the top of your script:
if [[ $(date +%u) -gt 5 ]]; then
echo 'Sorry, you cannot run this program on the weekend.'
exit
fi
Or the more succinct:
[[ $(date +%u) -gt 5 ]] && { echo "Weekend, not running"; exit; }
To check if it's a weekday, use the opposite sense (< 6 rather than > 5):
$(date +%u) -lt 6
case "$(date +%a)" in
Sat|Sun) echo "weekend";;
esac
This is actually a surprisingly difficult problem, because who is to say that "weekend" means Saturday and Sunday... what constitutes "the weekend" can actually vary across cultures (e.g. in Israel, people work on Sunday and have Friday off). While you can get the date with the date command, you will need to store some additional data indicating what constitutes the weekend for each locale if you are to implement this in a way that works for all users. If you target only one country, then the solution posed in the other answers will work... but it is always good to keep in mind the assumptions being made here.
Use Perl's localtime operator.
localtime
Converts a time as returned by the time function to a 9-element list with the time analyzed for the local time zone. Typically used as follows:
# 0 1 2 3 4 5 6 7 8
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
…
$wday is the day of the week, with 0 indicating Sunday and 3 indicating Wednesday.
For example:
$ date
Sun Aug 15 20:27:29 CDT 2010
$ perl -le 'my $wday = (localtime)[6];
print $wday >= 1 && $wday <= 5 ? "weekday" : "weekend"'
weekend
printf also has date
printf -v day '%(%a)T'
case $day in
Sat|Sun) echo "Hooray!";;
esac
https://ideone.com/wU7C0c - demo
I am not really sure if this is suited to this question but I wanted to share this it to help others out and this is the closest Stack question to what I was looking for.
This is a shell script that I use for starting an application when i boot my computer, the application cannot connect to its server over the weekend (its down for maintenance as the service doesn't run at weekends (forex trading application).
Information about this script, d is 1 to 7 (mon to sun) h is 24 time. You can adjust this to your own settings, maybe you have a midweek maintenance or any other cause. This is my first ever shell script, so I'm sure there is a better way and if anybody wants make edits, feel free I will review for acceptance (or somebody else may do it)
#!/bin/bash
d=$(date +%u)
h=$(date +%H)
case $d in
'5')
# Friday after 10pm
if (($h >= 22)) ; then
exit
fi
;;
'6')
# all day saturday
exit
;;
'7')
#sunday before 10pm
if (($h < 22)) ; then
exit
fi
;;
*)
# any other time run the program
;;
esac
I like this way of running programs on weekdays:
[[ $(date +%u) -lt 6 ]] && weekday-program
It is a bit tricky construction, but compact and easy to add.