72

Ok, So I've made my script, I dropped it in /etc/cron.hourly then I chmod 777 the file but it won't run (automatically). If I manually run it, it works fine. Do I need to do anything else?

1
  • This answer shouldn't have received that many upvotes without name of file and content. Feb 5, 2018 at 16:46

6 Answers 6

188

Entries in cron.hourly are run by the run-parts mechanism (man run-parts for more info). And run-parts is choosy about what filenames it considers valid.

For example, giving your script an extension will make it invalid and result in the job not being run. [a-zA-Z0-9_-] are the valid characters, so the '.' makes it invalid.

When adding a job to /etc/cron.hourly ( or .daily, .weekly, etc), always test afterwards that run-parts will actually run it by issuing the command:

run-parts --test /etc/cron.hourly

If by running this command it shows your file it means it worked. Otherwise, if doesn't show anything your file name is not valid.

What was the name of your script?

12
  • 27
    correct, no good :) [a-zA-Z0-9_-] are the valid characters, so the '.' makes it invalid. This is what i meant above by 'giving your script an extension will make it invalid'
    – DaithiF
    May 19, 2011 at 16:43
  • 15
    oMG, This just saved a huge headache. THANK YOU! giving your script an extension will make it invalid and result in the job not being run Dec 5, 2013 at 22:16
  • 3
    Thanks for this info. My issue was that the script wasn't executable, chmod +x /etc/cron.hourly/myscript did the trick and run-parts listed it as expected.
    – Yvan
    Nov 8, 2019 at 10:08
  • 3
    That's pretty annoying, especially since cron.hourly directory has a dot in its name, which suggests that dot is okay
    – galets
    Dec 19, 2020 at 19:40
  • 2
    a fundmantal tenet of UX is "don't surprise the user". Why on earth would a . not be a valid character for something running under run-parts? What kind of incompetent developer makes such choices?
    – JayEye
    Apr 1, 2021 at 7:40
12

Why not using crontab ( /etc/crontab ) and use */1 in the hour field. I have used this to run a script every 5 min and it works well:

# m h dom mon dow user  command
* */1  * * *   user    command
5
  • 7
    Using cron.daily and friends works a bit better if the machine is not running all the time, because anacron tries to approximate the right schedule whereas plain cron will just not run them if the machine is not on all night. For hourly jobs this probably doesn't matter so much.
    – poolie
    Dec 2, 2010 at 0:20
  • 10
    I really appreciate the next answer, as it addresses the problem with cron.hourly, rather than finding a workaround.
    – tishma
    Jan 24, 2014 at 14:24
  • 5
    This is not an answer to the question Nov 16, 2016 at 15:48
  • @poolie As can be seen on /etc/crontab: cron.daily, cron.weekly and cron.monthly run with anacron (if available) but hourly run-parts --report /etc/cron.hourly. Feb 5, 2018 at 15:24
  • Copy a script into specific directory or just delete it inside, it's much easier to deploy.
    – Shawyeok
    Sep 15, 2022 at 11:32
8

DaithiF's answer should be the right answer.

Also, my script didn't have #!/bin/bash in the first line. Even though the script could be executed with the command line, run-parts rejected it saying "Exec format error".

Changing the file name from scriptname.sh to scriptname and adding the #!/bin/bash into first line enabled my script to run hourly.

5

Your problem is probably down to the overly open permissions, which allows anybody to edit your file. Try 755 instead.

Looking in the cron entries in your syslog output should confirm this.

0
2

In my case I made these errors due to which cron.hourly wont execute my script:

  1. I forgot to check if crond service is running: systemctl status crond

  2. I haven't added new empty line in the very end of my script file like cron's scripts in other folders have.

  3. I created my script file using WinSCP on Windows thus inserted Windows-like EOL symbol, which cron can't interpret correctly. So I needed to execute sed -i -e 's/\r$//' /etc/cron.hourly/myscript to fix it.

-1

When you run

crontab -l

is this task on the list?

if not, add it

crontab -e

add this line

0 * * * * yourScript

if it is in this list, try to add the path of programing language to the top of your script

Example:

bash: #!/bin/bash

This 2 things always solved my problems :)

1
  • Done it all and the script is good, it works like a charm. It's in the crontab list too but no hourly task runs. Thanks anyway :(
    – Switchkick
    Oct 20, 2010 at 8:17

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .