Instead of typing "crontab -e" I accidentally typed "crontab" and was stuck in the middle of a process so I aborted the process. Now when I go to crontab -e it's entirely blank. This isn't good at all. If I can't get it back I will need to rewrite it.

Is there any way to:

  1. get my crontab jobs back? are they in memory somewhere? Where are the account specific crontab files located in linux? OR
  2. get a log of all things that cron has done, so I can reverse engineer my crontab file. I hadn't looked at it in a long time?
2

5 Answers

crontab with no arguments reads a crontab file from standard input. For example, you might use:

 echo "* * * * * run-this-every-minute" | crontab 

Once you've clobbered your crontab (i.e., crontab -l shows nothing), there's no good way to get it back.

On my system (Ubuntu 11.04), personal crontabs are stored in /var/spool/cron/crontabs/<USER> -- but that's what you clobbered, so that won't do you any good. (The path could be different on your system.)

I see entries in /var/log/syslog for commands executed by cron; you might be able to reconstruct your crontab from that (or your system's equivalent, if any), but it's going to be tedious.

Here's what I do to avoid this kind of problem:

I keep my crontab in a separate file, maintained in a source control system. I install it only by running

crontab filename 

I never use crontab -e. If I accidentally clobber my crontab, I can just reload it from the file. (Well, hardly ever; I sometimes use crontab -e to make temporary changes, knowing that I can restore the current version later.)

2

Script for full crontab recovery

I made a PHP script that does a full recovery of your crontab, based on the log.

It outputs a single instance of every cron command run by the user for the last week.

I put it here

Here is a sample output:

perl ~/sorttv/sorttv.pl /usr/local/bin/flexget bash ~/scripts/sort_sports.sh ~/scripts/play_recently_added.sh 
0

I'm sorry, but I can't help asking the obvious: why not restore it from backup?

Er, sorry, I see that was suggested already.

If your EDITOR envrionment variable is EDITOR=vi, try

vi -r 

to recover the session. Do not directly write the saved session, if you get one, to your crontab directory. Use it as a guide to recreate your crontab using

crontab -e 

Note: Since you did not specify an OS, Solaris and other UNIX OSes do not recognize changes to crontab files except those created through crontab -e. If I remember correctly, Linux does.

1

Great answer from @Keith Thompson - good idea reconstructing from /var/log/syslog!

I also accidentally clobbered my user crontab but was able to reconstruct it with the following script-fu

mkdir ~/syslog sudo cp /var/log/syslog* ~/syslog/ sudo chmod 777 ~/syslog/* cat ~/syslog/* | grep "(username)" | grep -o "CMD.*" | sort | uniq 

where username should be replaced with the user whose crontab you want to reconstruct.

Note that you may need to gunzip the contents of your /var/log/syslog.x.gz files first if the logs have been compressed (ubuntu zips up syslog.2+)

This will also only get commands that are still in the logs, which will be about the last 7 days... so if you have a monthly task that didn't run... that one is probably gone

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy