48

How are files under /etc/cron.d used?

From https://www.cyberciti.biz/faq/how-do-i-add-jobs-to-cron-under-linux-or-unix-oses/

cron reads the files in /etc/cron.d/ directory. Usually system daemon such as sa-update or sysstat places their cronjob here. As a root user or superuser you can use following directories to configure cron jobs. You can directly drop your scripts here. The run-parts command run scripts or programs in a directory via /etc/crontab file:

/etc/cron.d/ Put all scripts here and call them from /etc/crontab file.

On Lubuntu 18.04, the files under /etc/cron.d seem to be crontab files not shell scripts (which was mentioned in the above link):

$ cat /etc/cron.d/anacron 
# /etc/cron.d/anacron: crontab entries for the anacron package

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

30 7    * * *   root    [ -x /etc/init.d/anacron ] && if [ ! -d /run/systemd/system ]; then /usr/sbin/invoke-rc.d anacron start >/dev/null; fi

My /etc/crontab file never refers to files under/etc/cron.d, contrary to what the link says:

$ cat /etc/crontab 
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

Could you explain how the files under /etc/cron.d are used? Thanks.

Stephen Kitt
  • 434,908
Tim
  • 101,790

1 Answers1

47

In Debian derivatives, including Lubuntu, the files in /etc/cron.d are effectively /etc/crontab snippets, with the same format. Quoting the cron manpage:

Additionally, in Debian, cron reads the files in the /etc/cron.d directory. cron treats the files in /etc/cron.d as in the same way as the /etc/crontab file (they follow the special format of that file, i.e. they include the user field). However, they are independent of /etc/crontab: they do not, for example, inherit environment variable settings from it. This change is specific to Debian see the note under DEBIAN SPECIFIC below.

Like /etc/crontab, the files in the /etc/cron.d directory are monitored for changes. In general, the system administrator should not use /etc/cron.d/, but use the standard system crontab /etc/crontab.

The Debian-specific section hints at the reason system administrators shouldn’t use /etc/cron.d:

Support for /etc/cron.d (drop-in dir for package crontabs)

It’s designed to allow packages to install crontab snippets without having to modify /etc/crontab.

Stephen Kitt
  • 434,908
  • 1
    Thanks. Are the files in /etc/cron.d and /etc/crontab independent of each other, and read by crond independently and separately? Or does /etc/crontab ever include the files in /etc/cron.d? – Tim Jul 26 '18 at 23:53
  • 1
    “However, they are independent of /etc/crontab”, as quoted above. To be absolutely clear, /etc/crontab doesn’t include files from /etc/cron.d by default. (As an administrator, you could place commands in /etc/cron.d and use them in /etc/crontab, but that would be thoroughly confusing.) – Stephen Kitt Jul 26 '18 at 23:59
  • Thanks. "In general, the system administrator should not use /etc/cron.d/, but use the standard system crontab /etc/crontab." When should a sysadmin use /var/spool/cron/crontabs/root or /etc/crontab? – Tim Oct 31 '18 at 18:55
  • I only ever use /var/spool/cron for user-specific jobs. Any system job should go in /etc/crontab or /etc/cron.{hourly,daily,weekly,monthly} IMO. – Stephen Kitt Nov 01 '18 at 14:32
  • Thanks. (1) What do "system job" and "user specific job" mean? (2) Is /var/spool/cron/crontabs/root for system jobs? root-specific jobs are system jobs, I guess? (3) anacron by default only runs /etc/cron.{hourly,daily,weekly,monthly}/*, so is anacron used only for system jobs not for user-specific jobs? – Tim Nov 01 '18 at 14:57
  • As far as I’m concerned, as I said above /var/spool/cron/crontabs is for user-specific jobs. If an admin chooses to use root as a user account, then it would make sense for root’s jobs (the user’s, not the system’s) to go in /var/spool/cron/crontabs/root. But since root shouldn’t be used as a user account, I tend to think that /var/spool/cron/crontabs/root shouldn’t be used either. – Stephen Kitt Nov 01 '18 at 15:02
  • 3
    Please don’t edit comments so radically when they ask questions :-(. – Stephen Kitt Nov 01 '18 at 15:03
  • A system job is a job which applies to the whole system. A user-specific job is a job run on behalf of a specific user; typically, tasks which the user would do manually while logged in, but which he/she wishes to perform periodically and automatically — e.g. backups of specific files, or refreshes of remote development repositories, or mail processing, or mirroring web sites... – Stephen Kitt Nov 01 '18 at 15:05
  • anacron only deals with system jobs, yes. – Stephen Kitt Nov 01 '18 at 15:05
  • Thanks. My apology. sudo crontab -e will create /var/spool/cron/crontabs/root, so I thought that that file can be created so must be used for some purpose. – Tim Nov 01 '18 at 15:06
  • crontab -e run as any user will create a user-specific crontab for that user; root is no different. But the way root should be used means there’s not much point in having a root-specific crontab in /var/spool/cron. – Stephen Kitt Nov 01 '18 at 15:12
  • 36
    People might miss, that "the file names must conform to the filename requirements of run-parts" (see Debian's man cron). So filenames in /etc/cron.d/ which match the shell glob *[!A-Za-z0-9_-]* are ignored! Hence things like *.dpkg-dist or vi-backups *~ do no harm, but if you accidentally create /etc/cron.d/very_important.crontab, this will get ignored due to the . in it! – Tino Jan 16 '19 at 19:06
  • 20
    Another thing to take note of is files in /etc/cron.d *MUST* include the user field or they simply will not run - with nothing being logged to indicate what the problem is. – FKEinternet Oct 28 '19 at 22:00
  • My /etc/cron.d/company does not seem to run /3 * * * www-data /home/company/path/to/script Running su - www-data -c /home/company/path/to/script is working – Loenix Nov 05 '21 at 14:01
  • Does "are monitored for changes" mean I don't have to restart anything after a modification to cron.d files? – racitup Apr 12 '22 at 00:07
  • @racitup that‘s right, nothing needs to be restarted or reloaded. – Stephen Kitt Apr 12 '22 at 04:06