¿Dónde se almacena el crontab de usuario?

249

Desde la actualización, el crontab de mi usuario ha sido eliminado. Esta no es la primera vez que esto sucede este año y es un dolor restaurarlo cada vez.

Me gustaría poder hacer una copia de seguridad del crontab para mi usuario, pero para eso necesito saber dónde está almacenado.

Oli
fuente
44
Sería bueno si alguien también pudiera dar una razón por la que está borrada
Walter Tross
1
@WalterTross Sí, es bastante molesto. Supongo que es un efecto secundario de actualizar el cronpaquete, pero estoy de acuerdo, no es algo que deba suceder.
Oli
¡Uh, no creo que los usuarios cron se borren por actualización de paquete cron!
pl1nk
@ pl1nk No tengo idea de qué lo está borrando, pero sigue sucediendo. Fantasma en la máquina, supongo.
Oli
Las tablas de usuario se almacenan en un área temporal / var / spool / cron / crontabs / $ USER, por lo que pueden eliminarse en su próximo arranque o actualización.
fcm

Respuestas:

325

En realidad, no se recomienda manejar esos archivos a mano. Por crontabpágina de manual:

Cada usuario puede tener su propio crontab, y aunque
estos son archivos /var/spool/cron/crontabs, no están
destinados a ser editados directamente.

Los archivos bajo /var/spoolse consideran temporales / en funcionamiento, por eso probablemente se eliminen durante una actualización, aunque una mirada más cercana a los cronscripts de actualización del paquete puede arrojar algo de luz sobre esto.

De todos modos, siempre es una buena práctica hacer una copia de seguridad de sus entradas cron o guardarlas en un archivo en su directorio de inicio.

Supongo que está utilizando crontab -epara crear archivos crontab sobre la marcha. Si es así, puede obtener una "copia" de su archivo crontab haciendo crontab -l. Canalice eso a un archivo para obtener una "copia de seguridad":

crontab -l > my-crontab

Luego puede editar ese archivo my-crontab para agregar o modificar entradas, y luego "instalarlo" dándolo a crontab:

crontab my-crontab

Esto hace la misma verificación de sintaxis que crontab -e.

roadmr
fuente
77
crontab -les más fácil que pasar /var/spool/cron/crontabs/$USERdebido a los extraños permisos en ese archivo.
Oli
1
El iptables-savede cron. Nice ...
Parthian Shot
44
¿Quizás deberíamos poner un crontab para hacer una copia de seguridad automáticamente> :)?
PascalVKooten
44
Examinar /var/spool/cron/crontabses útil cuando desea seleccionar o examinar crontabs de múltiples usuarios.
Dhasenan
1
Al investigar los misterios en un servidor que no está familiarizado con, es común sudo grep -rHin "$string" /etc/cron*(en el que la cadena podría ser un comando como docker, lftp, iptables, etc. Es una buena idea para comprobar crontabs de usuario también Eso es lo que me llevó a este Q & A..sudo grep -rHin "$string" /etc/cron* /var/spool/cron*
Bruno Bronosky
50

Se almacena dentro de la /var/spool/cron/crontabscarpeta con nombre de usuario.

Manula Waidyanatha
fuente
30

Finalmente descubrí por qué mis crontabs y la instalación de Postfix seguían fallando después del arranque. Es una razón realmente estúpida pero ...

Me había /var/spoolmontado como una tmpfsunidad de RAM.

Suena idiota y lo es, pero había seguido uno de los viejos ajustes de SSD para alargar la vida de mi SSD. Al hacerlo, me monté a ciegas /tmp, /var/tmpy /var/spoolcomo tmpfssin pensar en las consecuencias. Pensé que /var/spoolera como /proc/o /run/y que solo era útil durante la sesión. Estaba claramente equivocado.

Oli
fuente
8
Debería ser seguro montarlo /tmpcomo tmpfs, pero no /var/tmpo /var/spool. /tmpse usa para almacenamiento temporal que puede perderse al reiniciar. /var/tmpse usa para el almacenamiento temporal que permanecerá después de un reinicio. Y como has descubierto, /var/spooles para procesar los datos, que también permanecerán después de un reinicio.
thomasrutter
2
Tenga en cuenta también que el recuento de escritura ya no es un problema con los SSD modernos.
thomasrutter
17

Para enumerar todos los trabajos cron de todos los usuarios en su sistema:

for user in $(cut -f1 -d: /etc/passwd)
do
  echo $user
  crontab -u $user -l
done

Una alternativa a su problema sería colocarlos en la carpeta cron.d y especificar el usuario apropiado por cron como en el ejemplo:

00 01 * * * user /home/user/user-script.sh
pl1nk
fuente
Si está recuperando el crontab de otra unidad, esto no funcionará porque se crontab -uestá ejecutando desde su sistema actual.
JVE999
Si bien supongo que es una línea en la que cabe en menos de 80 caracteres y es algo legible, generalmente me gusta poner el código en un formato tal que una persona pueda copiarlo o pegarlo en un script (y, en un script, esto no sería una línea de código). Sugerir edición ...
Parthian Shot
Además, estaba a punto de convertirlo en un while read userbucle, para manejar el caso donde el nombre de usuario contiene espacios, pero aparentemente eso no es un problema. Conjunto muy limitado de caracteres de nombre de usuario.
Parthian Shot