Crontab supprimé?

11

Au lieu de taper "crontab -e", j'ai accidentellement tapé "crontab" et j'ai été bloqué au milieu d'un processus, j'ai donc abandonné le processus. Maintenant, quand je vais à crontab -e, il est entièrement vide. Ce n'est pas bon du tout. Si je ne peux pas le récupérer, je devrai le réécrire.

Existe-t-il un moyen de:

  1. récupérer mes emplois crontab? sont-ils en mémoire quelque part? Où se trouvent les fichiers crontab spécifiques au compte sous Linux? OU
  2. obtenir un journal de tout ce que cron a fait, afin que je puisse inverser l'ingénierie de mon fichier crontab. Je ne l'avais pas regardé depuis longtemps?
user12832
la source
3
Il vous suffit de le restaurer à partir de votre dernière sauvegarde système.
David Heffernan
Si vous avez tapé crontab -r comme je l'ai fait et trouvé ce fil, vous pouvez récupérer la commande en lisant les journaux depuis / var / log. Dans mon cas, syslog.1 avait tout ce dont j'avais besoin
StackUnder

Réponses:

14

crontabsans argument lit un fichier crontab à partir de l'entrée standard. Par exemple, vous pouvez utiliser:

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

Une fois que vous avez encombré votre crontab (c'est-à-dire qu'il crontab -lne montre rien), il n'y a pas de bon moyen de le récupérer.

Sur mon système (Ubuntu 11.04), les crontabs personnels sont stockés dans /var/spool/cron/crontabs/<USER>- mais c'est ce que vous avez tapoté, donc cela ne vous fera aucun bien. (Le chemin peut être différent sur votre système.)

Je vois des entrées /var/log/syslogpour les commandes exécutées par cron; vous pourriez être en mesure de reconstruire votre crontab à partir de cela (ou l'équivalent de votre système, le cas échéant), mais cela va être fastidieux.

Voici ce que je fais pour éviter ce genre de problème:

Je garde ma crontab dans un fichier séparé, maintenu dans un système de contrôle de source. Je l'installe uniquement en exécutant

crontab filename

Je n'utilise jamais crontab -e. Si j'encombre accidentellement mon crontab, je peux simplement le recharger à partir du fichier. (Eh bien, presque jamais; j'utilise parfois crontab -epour apporter des modifications temporaires, sachant que je peux restaurer la version actuelle plus tard.)

Keith Thompson
la source
@mountainclimber: Je ne suis pas d'accord. Pour enregistrer votre crontab, utilisez crontab -l > filename. Pour restaurer, crontab filename. Utilisez l'interface fournie par le système; n'allez pas derrière lui et manipulez les fichiers système. D'une part, la mise à jour du fichier ne demandera pas nécessairement au système de le relire; la crontabcommande le fera. Pour un autre, il peut y avoir des différences entre le contenu du fichier et la sortie de crontab -l; sur Ubuntu, le fichier a quelques lignes de commentaires supplémentaires vous conseillant de ne pas le modifier.
Keith Thompson
Je vais supprimer mon autre commentaire. Nouveau commentaire: Keith mentionne le chemin /var/spool/cron/crontabs/<USER>. Sur SUSE, mon chemin est légèrement différent (note slash supplémentaire): /var/spool/cron/cron/tabs/<USER>. Je pensais que je le mentionnerais pour les débutants comme Cron et Linux comme moi. La réponse de Keith est correcte.
mountainclimber
5

Script pour la récupération complète de crontab

J'ai fait un script PHP qui fait une récupération complète de votre crontab, basé sur le journal.

Il génère une seule instance de chaque commande cron exécutée par l'utilisateur la semaine dernière.

Je le mets ici

https://github.com/dangreenisrael/recover_crontab

Voici un exemple de sortie:

perl ~/sorttv/sorttv.pl

/usr/local/bin/flexget

bash ~/scripts/sort_sports.sh

~/scripts/play_recently_added.sh
Dan Green-Leipciger
la source
1

Je suis désolé, mais je ne peux m'empêcher de demander l'évidence: pourquoi ne pas le restaurer à partir d'une sauvegarde?

Euh, désolé, je vois que cela a déjà été suggéré.

Lee-Man
la source
0

Si votre variable d'environnement EDITOR est EDITOR = vi, essayez

vi -r

pour récupérer la session. N'écrivez pas directement la session enregistrée, si vous en avez une, dans votre répertoire crontab. Utilisez-le comme un guide pour recréer votre crontab en utilisant

crontab -e

Remarque: Étant donné que vous n'avez pas spécifié de système d'exploitation, Solaris et les autres systèmes d'exploitation UNIX ne reconnaissent pas les modifications apportées aux fichiers crontab, à l'exception de celles créées via crontab -e. Si je me souviens bien, Linux le fait.

Jim Mcnamara
la source
Il n'y a pas de session à récupérer; l'OP a tapé crontabplutôt que crontab -e. Voir ma réponse pour une meilleure façon (à mon humble avis) de maintenir votre crontab.
Keith Thompson
0

Grande réponse de @Keith Thompson - bonne idée de reconstruire à partir de / var / log / syslog!

J'ai également accidentellement encombré mon utilisateur crontab mais j'ai pu le reconstruire avec le script-fu suivant

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

où nom d'utilisateur doit être remplacé par l'utilisateur dont vous souhaitez reconstruire la crontab.

Notez que vous devrez peut-être d'abord compresser le contenu de vos fichiers /var/log/syslog.x.gz si les journaux ont été compressés (ubuntu zips up syslog.2 +)

Cela n'obtiendra également que les commandes qui sont toujours dans les journaux, ce qui correspondra aux 7 derniers jours ... donc si vous avez une tâche mensuelle qui ne s'est pas exécutée ... celle-ci est probablement partie

Jamie Cook
la source