Où l'utilisateur crontab est-il stocké?

249

Depuis la mise à niveau, la crontab de mon utilisateur a été supprimée. Ce n’est pas la première fois que cela se produit cette année et c’est pénible de le restaurer à chaque fois.

J'aimerais pouvoir sauvegarder la crontab pour mon utilisateur, mais pour cela, j'ai besoin de savoir où elle est stockée.

Oli
la source
4
ce serait bien si quelqu'un pouvait aussi donner une raison POURQUOI c'est effacé
Walter Tross
1
@ WalterTross Ouais, c'est assez énervant. Je suppose que c'est un effet secondaire de la mise à jour du cronpaquet mais je suis d'accord - ce n'est pas quelque chose qui devrait arriver.
Oli
Euh, je ne veux pas que l'utilisateur cron soit effacé par la mise à jour du paquetage cron!
pl1nk
@ pl1nk Je n'ai aucune idée de ce qui l'efface, mais cela continue. Fantôme dans la machine, je suppose.
Oli
Les tables utilisateur sont stockées dans une zone temporaire / var / spool / cron / crontabs / $ USER. Elles peuvent donc être supprimées lors de votre prochain démarrage ou de la mise à niveau.
fcm

Réponses:

325

En fait, il n'est pas recommandé de manipuler ces fichiers à la main. Par crontabpage:

Chaque utilisateur peut avoir sa propre crontab, et bien
qu'il /var/spool/cron/crontabss'agisse de fichiers , ils ne sont pas
destinés à être modifiés directement.

Les fichiers situés sous /var/spoolsont considérés comme temporaires / fonctionnels, c'est pourquoi ils sont probablement supprimés lors d'une mise à niveau, bien qu'un regard plus attentif sur les cronscripts de mise à niveau du paquet puisse faire la lumière sur ceci.

Quoi qu'il en soit, il est toujours judicieux de sauvegarder vos entrées cron ou de les conserver dans un fichier de votre répertoire personnel.

Je suppose que vous utilisez crontab -epour créer des fichiers crontab à la volée. Si c'est le cas, vous pouvez obtenir une "copie" de votre fichier crontab crontab -l. Transférez-le dans un fichier pour obtenir une "sauvegarde":

crontab -l > my-crontab

Ensuite, vous pouvez éditer ce fichier my-crontab pour ajouter ou modifier des entrées, puis "l’installer" en le donnant à crontab:

crontab my-crontab

Ceci effectue la même vérification de syntaxe que crontab -e.

roadmr
la source
7
crontab -lest plus facile que de passer /var/spool/cron/crontabs/$USERprincipalement à cause des autorisations bizarres sur ce fichier.
Oli
1
Le iptables-savede cron. Nice ...
Parthian Shot
4
Peut-être devrions-nous mettre une crontab pour se sauvegarder automatiquement> :)?
PascalVKooten
4
Il /var/spool/cron/crontabsest pratique de passer à travers lorsque vous voulez organiser ou examiner des crontabs de plusieurs utilisateurs.
Dhasenan
1
Lors de l' étude des mystères sur un serveur que vous n'êtes pas familier avec, il est fréquent de sudo grep -rHin "$string" /etc/cron*(où la chaîne peut être une commande comme docker, lftp, iptables, etc. Il est une bonne idée de vérifier crontab utilisateur aussi Voilà ce qui me conduit à ce Q & A..sudo grep -rHin "$string" /etc/cron* /var/spool/cron*
Bruno Bronosky
50

Son stocké dans le /var/spool/cron/crontabsdossier sous nom d'utilisateur.

Manula Waidyanatha
la source
30

J'ai enfin découvert pourquoi mon installation de crontabs et Postfix ne fonctionnait plus après le démarrage. C'est une raison vraiment stupide mais ...

J'avais /var/spoolmonté comme un tmpfslecteur de RAM.

Cela semble idiot et c'est le cas, mais j'avais suivi l'un des vieux réglages du SSD pour prolonger la vie de mon SSD. Ce faisant, je aveuglément montais /tmp, /var/tmpet /var/spoolcomme tmpfssans penser aux répercussions. Je pensais que /var/spoolc'était comme /proc/ou /run/et que ce n'était utile que pour la durée de la session. J'avais clairement tort.

Oli
la source
8
Il devrait être sûr de monter en /tmptant que tmpfs, mais pas /var/tmpou /var/spool. /tmpest utilisé pour le stockage temporaire qui peut être perdu au redémarrage. /var/tmpest utilisé pour le stockage temporaire qui restera après un redémarrage. Et comme vous l'avez découvert, les /var/spooldonnées doivent être traitées, elles resteront également après un redémarrage.
thomasrutter
2
Notez également que le nombre d'écritures n'est plus un problème avec les SSD modernes.
thomasrutter
17

Pour répertorier tous les travaux cron de tous les utilisateurs de votre système:

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

Une alternative à votre problème serait de les placer dans le dossier cron.d et de spécifier l'utilisateur approprié par cron, comme dans l'exemple:

00 01 * * * user /home/user/user-script.sh
pl1nk
la source
si vous récupérez la crontab à partir d'un autre lecteur, cela ne fonctionnera pas car il crontab -uest exécuté à partir de votre système actuel.
JVE999
Bien que je suppose qu’il s’agisse d’une solution unilatérale, dans la mesure où elle contient moins de 80 caractères et est assez lisible, j’aime généralement placer le code dans un format permettant à une personne de la copier-coller ou de la mettre dans un script (et, dans un script, ce ne serait pas une ligne de code). Suggérant éditer ...
Parthian Shot
De plus, j'étais sur le point de le transformer en while read userboucle pour gérer le cas où le nom d'utilisateur contient des espaces, mais apparemment, ce n'est pas un problème. Ensemble très limité de caractères de nom d'utilisateur.
Parthian Shot