31

Today is November 1st 2016 or in (unambiguous) numerals, 2016-11-01.

I have a user cron job set up like this:

# m h  dom mon dow   command
33  3   1  */2  *    /home/user/...

It is supposed to run every other month on the first of the month at 3:33am, no matter what day of week that is, but for some reason it was run today, even though 11 is not divisible by 2.

Can someone explain me this? Is my assumption of divisibility by 2 wrong?

EDIT: I forgot to mention, I am running cron version "3.0pl1-127+deb8u1" on a Debian 8.6 "Jessie" machine.

Ilmari Karonen
  • 895
  • 5
  • 11
comfreak
  • 1,451
  • 1
  • 21
  • 32

2 Answers2

61

The / is not an arithmetic expression, instead it describes "step values" over the allowed range of values. So, since months always start with 1 instead of 0, /2 would mean "take every other value", resulting in (1, 3, 5, 7, 9, 11).

This is also decribed in the manual page, although this is not terrible clear and easy to understand:

Step values can be used in conjunction with ranges. Following a range with "<number>" specifies skips of the number’s value through the range. For example, "0-23/2" can be used in the hours field to specify command execution every other hour (the alternative in the V7 standard is "0,2,4,6,8,10,12,14,16,18,20,22"). Steps are also permitted after an asterisk, so if you want to say "every two hours", just use "*/2".

Michael Hampton
  • 237,123
  • 42
  • 477
  • 940
Sven
  • 97,248
  • 13
  • 177
  • 225
  • 2
    Thanks for your answer, I just realized this myself after reading the man page again and working this through in my head. I was usually only working with shorter term cron jobs where the numbers start with 0 and my assumption actually made sense in a way. – comfreak Nov 01 '16 at 12:13
  • 18
    I just mused why this question isn't asked more often and came to the same conclusion: Because few people run jobs with anything then a "*" in the month field. – Sven Nov 01 '16 at 12:15
  • One question, what would happen if the number does not divide, e.g. `*/5`? Would it be 1,6,11,1,6... or would it be 1,6,11,4,9...? I assumed that "over the allowed range of values" means that it has no memory, but now I was not being so sure about that. – MariusSiuram Nov 02 '16 at 14:38
  • @MariusSiuram: The first variant. Again, this is not an arithmetic operation. `crond` just takes the list of possible values, applies the step selector once and then use these results repeatedly. – Sven Nov 02 '16 at 14:41
4

Today is the first day in November.

*/2 means that your cronjob will execute every other month as you say.

So next month (December) the cronjob will not be executed, but the month (January) after it will be.

The month before this month (October) the cronjob was not executed. But in September it was.

Orphans
  • 1,404
  • 17
  • 26