cron jobs - difference between editing "/etc/crontab" and "crontab -e"
Trying to set up a daily cron
job to shut down a server.
One source suggests editing /etc/crontab
Another suggests crontab -e
(with sudo
)
I tried the latter, and my process did not run (if I recall, it was 30 23 * * * shutdown -h
)
I also note that in the nano editor, it was working on a .tmp
file? (top of nano says: /tmp/crontab.9zeTNt/crontab
)
What is going on? How can I fix this?
Solution 1:
crontab -e
:
Usable on a per user basis; opens the cron
table for the invoking user for editing (a temporary file in /tmp/
e.g. /tmp/crontab.<RANDOM>/crontab
, as you have seen) and upon saving the content, sanity checkings are done. If passed, the file is moved into /var/spool/cron/crontabs/
i.e. the cron
spool directory and saved with the filename being same as the invoking user's name. As the cron
table is being saved for the invoking username (e.g. /var/spool/cron/crontabs/foobar
, assuming username foobar
); as all cron
jobs are run as that user so no username field is needed, each entry here needs 6 fields (you know these already i presume)
/etc/crontab
:
This is the system cron
table (crontab
file), there is no notion of invoking user here as only superuser can edit this file, do this file needs 7 fields, with an additional username field at space/tab separated 6th field. This is true for all cron
files in /etc/cron.d/
too. Another difference with crontab -e
is that you need to open the file as an argument to an editor or any program/shell that can do I/O whereas with crontab -e
the file would be open with the editor mentioned as VISUAL
or EDITOR
or /usr/bin/editor
-- the first one wins.
Why your command failed inside cron
:
Because shutdown
can only be run as superuser or capable users, and the invoking user presumably does not fall into that category. You can put the in root
's crontab
by sudo crontab -e
or put it /etc/crontab
, i usually always prefer individual user tables.
Notes:
Also cron
uses a minimal PATH
by default, and also SHELL
is set as sh
(dash
in Ubuntu); these two are common cron
pitfalls.
While debugging, always check syslog
, and redirect relevant command's STDOUT and STDERR to a file for analyzing later.