Crontab gelöscht?

11

Anstatt "crontab -e" einzugeben, habe ich versehentlich "crontab" eingegeben und war mitten in einem Prozess stecken geblieben, sodass ich den Vorgang abgebrochen habe. Wenn ich jetzt zu crontab -e gehe, ist es völlig leer. Das ist überhaupt nicht gut. Wenn ich es nicht zurückbekomme, muss ich es neu schreiben.

Gibt es eine Möglichkeit:

  1. Meine Crontab-Jobs zurückbekommen? sind sie irgendwo in Erinnerung? Wo befinden sich die kontospezifischen Crontab-Dateien unter Linux? ODER
  2. Holen Sie sich ein Protokoll aller Dinge, die Cron getan hat, damit ich meine Crontab-Datei zurückentwickeln kann. Ich hatte es lange nicht mehr angeschaut?
user12832
quelle
3
Stellen Sie es einfach von Ihrer letzten Systemsicherung wieder her.
David Heffernan
Wenn Sie crontab -r wie ich eingegeben und diesen Thread gefunden haben, können Sie den Befehl zum Lesen der Protokolle aus / var / log wiederherstellen. In meinem Fall hatte Syslog.1 alles, was ich brauchte
StackUnder

Antworten:

14

crontabOhne Argumente liest eine Crontab-Datei aus der Standardeingabe. Zum Beispiel könnten Sie verwenden:

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

Sobald Sie Ihre Crontab verstopft haben (dh crontab -lnichts mehr zeigen), gibt es keinen guten Weg, sie zurückzubekommen.

Auf meinem System (Ubuntu 11.04) sind persönliche Crontabs gespeichert /var/spool/cron/crontabs/<USER>- aber genau das haben Sie überfallen, sodass Sie nichts Gutes tun. (Der Pfad kann auf Ihrem System unterschiedlich sein.)

Ich sehe Einträge /var/log/syslogfür Befehle, die von ausgeführt werden cron. Möglicherweise können Sie Ihre Crontab daraus rekonstruieren (oder das Äquivalent Ihres Systems, falls vorhanden), aber es wird mühsam.

Folgendes tue ich, um diese Art von Problem zu vermeiden:

Ich behalte meine Crontab in einer separaten Datei, die in einem Versionsverwaltungssystem verwaltet wird. Ich installiere es nur durch Ausführen

crontab filename

Ich benutze nie crontab -e. Wenn ich versehentlich meine Crontab verstopfe, kann ich sie einfach aus der Datei neu laden. (Nun, kaum jemals; manchmal nehme crontab -eich vorübergehende Änderungen vor, da ich weiß, dass ich die aktuelle Version später wiederherstellen kann.)

Keith Thompson
quelle
@mountainclimber: Ich bin anderer Meinung. Verwenden Sie zum Speichern Ihrer Crontab crontab -l > filename. Um es wiederherzustellen , crontab filename. Verwenden Sie die vom System bereitgestellte Schnittstelle. Gehen Sie nicht hinter den Rücken und manipulieren Sie Systemdateien. Zum einen fordert das Aktualisieren der Datei das System nicht unbedingt auf, sie erneut zu lesen. Der crontabBefehl wird. Zum anderen kann es Unterschiede zwischen dem Inhalt der Datei und der Ausgabe von geben crontab -l. Unter Ubuntu enthält die Datei einige zusätzliche Kommentarzeilen, die Sie davon abhalten, sie zu bearbeiten.
Keith Thompson
Ich werde meinen anderen Kommentar löschen. Neuer Kommentar: Keith erwähnt den Weg /var/spool/cron/crontabs/<USER>. Bei SUSE ist mein Pfad etwas anders (beachten Sie den zusätzlichen Schrägstrich) : /var/spool/cron/cron/tabs/<USER>. Ich dachte, ich würde es für Neulinge erwähnen, die wie ich Cron und Linux sind. Die Antwort von Keith ist richtig.
Bergsteiger
5

Skript für die vollständige Wiederherstellung von Crontab

Ich habe ein PHP-Skript erstellt, das eine vollständige Wiederherstellung Ihrer Crontab basierend auf dem Protokoll ausführt.

Es gibt eine einzelne Instanz jedes Cron-Befehls aus, den der Benutzer in der letzten Woche ausgeführt hat.

Ich habe es hierher gebracht

https://github.com/dangreenisrael/recover_crontab

Hier ist eine Beispielausgabe:

perl ~/sorttv/sorttv.pl

/usr/local/bin/flexget

bash ~/scripts/sort_sports.sh

~/scripts/play_recently_added.sh
Dan Green-Leipciger
quelle
1

Es tut mir leid, aber ich kann nicht anders, als das Offensichtliche zu fragen: Warum nicht aus dem Backup wiederherstellen?

Tut mir leid, ich sehe, dass dies bereits vorgeschlagen wurde.

Lee-Man
quelle
0

Wenn Ihre EDITOR-Umgebungsvariable EDITOR = vi ist, versuchen Sie es

vi -r

um die Sitzung wiederherzustellen. Schreiben Sie die gespeicherte Sitzung, falls Sie eine erhalten, nicht direkt in Ihr crontab-Verzeichnis. Verwenden Sie es als Leitfaden, um Ihre Crontab mit neu zu erstellen

crontab -e

Hinweis: Da Sie kein Betriebssystem angegeben haben, erkennen Solaris und andere UNIX-Betriebssysteme keine Änderungen an Crontab-Dateien außer denen, die mit crontab -e erstellt wurden. Wenn ich mich richtig erinnere, tut es Linux.

Jim Mcnamara
quelle
Es gibt keine Sitzung zum Wiederherstellen. das OP tippte crontabeher als crontab -e. Siehe meine Antwort für eine bessere (IMHO) Möglichkeit, Ihre Crontab zu pflegen.
Keith Thompson
0

Tolle Antwort von @Keith Thompson - gute Idee, aus / var / log / syslog zu rekonstruieren!

Ich habe auch versehentlich meinen Benutzer crontab überfallen, konnte ihn aber mit dem folgenden Skript-Fu rekonstruieren

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

Dabei sollte der Benutzername durch den Benutzer ersetzt werden, dessen Crontab Sie rekonstruieren möchten.

Beachten Sie, dass Sie möglicherweise zuerst den Inhalt Ihrer /var/log/syslog.x.gz-Dateien mit einem Gunzip versehen müssen, wenn die Protokolle komprimiert wurden (Ubuntu komprimiert syslog.2 +).

Dadurch werden auch nur Befehle abgerufen, die sich noch in den Protokollen befinden. Dies sind ungefähr die letzten 7 Tage. Wenn Sie also eine monatliche Aufgabe haben, die nicht ausgeführt wurde, ist diese wahrscheinlich nicht mehr vorhanden

Jamie Cook
quelle