Crontab eliminado?

11

En lugar de escribir "crontab -e", accidentalmente escribí "crontab" y me quedé atrapado en medio de un proceso, así que aborté el proceso. Ahora cuando voy a crontab -e está completamente en blanco. Esto no es bueno en absoluto. Si no puedo recuperarlo, tendré que volver a escribirlo.

¿Hay alguna forma de:

  1. recuperar mis trabajos crontab? ¿están en memoria en alguna parte? ¿Dónde están ubicados los archivos crontab específicos de la cuenta en Linux? O
  2. obtener un registro de todas las cosas que ha hecho cron, para que pueda realizar ingeniería inversa en mi archivo crontab. ¿No lo había mirado en mucho tiempo?
usuario12832
fuente
3
Simplemente restaúrelo desde su copia de seguridad más reciente del sistema.
David Heffernan
Si escribió crontab -r como lo hice y encontró este hilo, puede recuperar el comando leyendo los registros de / var / log. En mi caso, syslog.1 tenía todo lo que necesitaba
StackUnder

Respuestas:

14

crontabsin argumentos lee un archivo crontab de la entrada estándar. Por ejemplo, puede usar:

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

Una vez que haya golpeado su crontab (es decir, crontab -lno muestra nada), no hay una buena manera de recuperarlo.

En mi sistema (Ubuntu 11.04), los crontabs personales se almacenan /var/spool/cron/crontabs/<USER>, pero eso es lo que usted aporreó, por lo que no le servirá de nada. (La ruta podría ser diferente en su sistema).

Veo entradas en los /var/log/syslogcomandos ejecutados por cron; es posible que pueda reconstruir su crontab a partir de eso (o el equivalente de su sistema, si lo hay), pero será tedioso.

Esto es lo que hago para evitar este tipo de problema:

Mantengo mi crontab en un archivo separado, mantenido en un sistema de control de fuente. Lo instalo solo ejecutando

crontab filename

Yo nunca uso crontab -e. Si accidentalmente golpeo mi crontab, puedo volver a cargarlo desde el archivo. (Bueno, casi nunca; a veces uso crontab -epara hacer cambios temporales, sabiendo que puedo restaurar la versión actual más adelante).

Keith Thompson
fuente
@mountainclimber: no estoy de acuerdo. Para guardar su crontab, use crontab -l > filename. Para restaurarlo, crontab filename. Use la interfaz proporcionada por el sistema; no te vayas detrás y manipules los archivos del sistema. Por un lado, actualizar el archivo no necesariamente le indicará al sistema que lo relea; el crontabcomando lo hará. Por otro lado, puede haber diferencias entre lo que hay en el archivo y la salida de crontab -l; en Ubuntu, el archivo tiene algunas líneas de comentarios adicionales que le aconsejan que no lo edite.
Keith Thompson el
Eliminaré mi otro comentario. Nuevo comentario: Keith menciona el camino /var/spool/cron/crontabs/<USER>. En SUSE, mi camino es ligeramente diferente (nota extra de barra): /var/spool/cron/cron/tabs/<USER>. Pensé que lo mencionaría para los novatos en cron y linux como yo. La respuesta de Keith es correcta.
mountainclimber
5

Script para la recuperación completa de crontab

Hice un script PHP que hace una recuperación completa de su crontab, basado en el registro.

Produce una sola instancia de cada comando cron ejecutado por el usuario durante la última semana.

Lo puse aqui

https://github.com/dangreenisrael/recover_crontab

Aquí hay una muestra de salida:

perl ~/sorttv/sorttv.pl

/usr/local/bin/flexget

bash ~/scripts/sort_sports.sh

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

Lo siento, pero no puedo evitar preguntar lo obvio: ¿por qué no restaurarlo desde la copia de seguridad?

Er, lo siento, veo que ya se sugirió.

Lee-Man
fuente
0

Si su variable de entorno EDITOR es EDITOR = vi, intente

vi -r

para recuperar la sesión No escriba directamente la sesión guardada, si la tiene, en su directorio crontab. Úselo como una guía para recrear su crontab usando

crontab -e

Nota: Como no especificó un sistema operativo, Solaris y otros sistemas operativos UNIX no reconocen los cambios en los archivos crontab, excepto los creados a través de crontab -e. Si no recuerdo mal, Linux sí.

jim mcnamara
fuente
No hay sesión para recuperarse; el OP escribió crontabmás que crontab -e. Vea mi respuesta para una mejor manera (en mi humilde opinión) de mantener su crontab.
Keith Thompson
0

Gran respuesta de @Keith Thompson: ¡buena idea reconstruir desde / var / log / syslog!

También accidentalmente golpeé mi crontab de usuario pero pude reconstruirlo con el siguiente script-fu

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

donde el nombre de usuario debe reemplazarse con el usuario cuyo crontab desea reconstruir.

Tenga en cuenta que es posible que deba comprimir el contenido de sus archivos /var/log/syslog.x.gz primero si los registros se han comprimido (ubuntu comprime syslog.2 +)

Esto también solo obtendrá comandos que todavía están en los registros, que serán aproximadamente los últimos 7 días ... así que si tiene una tarea mensual que no se ejecutó ... esa probablemente haya desaparecido

Jamie Cook
fuente