rsnapshot: Qu'est-ce qui ne va pas avec ma crontab?

1

J'utilise Rsnapshot pour les sauvegardes (Linux CentOS 6).

Voici mon /etc/cron.d/rsnapshot:

30 11 * * * root    /usr/bin/rsnapshot nowandthen > /backups/rsnapshot_cron.txt 2>&1
15 11 * * 4 root    /usr/bin/rsnapshot weekly > /backups/rsnapshot_cron.txt 2>&1
00 11 24-31 * 4 root    /usr/bin/rsnapshot monthly > /backups/rsnapshot_cron.txt 2>&1

La sauvegarde mensuelle devait être exécutée tous les jeudi derniers de chaque mois.

Cependant, la sauvegarde mensuelle est exécutée aujourd'hui, jeudi, 2016-février-18 à 11h00. Aujourd'hui n'est pas jeudi dernier dans un mois.

Quel est le problème avec ma crontab?

Danijel
la source
que voyez-vous dans vos journaux?
Jakuje
Votre crontab semble être correcte. Avez-vous la date correcte sur votre ordinateur? Quelle est la sortie de date? Quelque chose de pertinent dans grep CRON /var/log/syslog?
agtoever
Je ne peux pas expliquer pourquoi il a fonctionné le 18, mais souvenez-vous qu'il y a plusieurs crontabfichiers: en plus des /etcentrées, il y en a un pour chaque utilisateur, y compris root. Quoi qu'il en soit, votre script ne fera pas ce que vous voulez: si le dernier jour d'un mois de 31 jours est un jeudi, il se déroulera les 24 et 31 janvier; si le dernier jour de février est un mercredi, il ne fonctionnera pas du tout.
AFH

Réponses:

3

Selon ce site , votre chaîne signifie «À 11 heures les 24, 25, 26, 27, 28, 29, 30 et 31 de chaque mois et chaque jeudi.» (C'est moi qui souligne). Si le site est correct, cela expliquerait pourquoi il a fonctionné le 18.

L'exemple d'entrée man 5 crontabpour s'exécuter le 2e samedi est le suivant:

0 4 8-14 * *    test $(date +\%u) -eq 6 && echo "2nd Saturday"

(c’est-à-dire exécuter tous les jours de la deuxième semaine et vérifier le jour de la semaine dans le cadre de la commande) - cela confirme le point de vue selon lequel le jour de la semaine est un filtre alternatif supplémentaire et non une qualification supplémentaire, bien que la page de manuel ne le rende pas. clair.

Donc, dans votre cas, j'utiliserais:

00 11 * * 4 root test $(date -d @$((`date +\%s`+604800)) +\%m) -ne $(date +\%m) && /usr/bin/rsnapshot monthly > /backups/rsnapshot_cron.txt 2>&1

Vérifiez si vos datesupports -d 'next Thursday': si oui, vous pouvez utiliser le plus simple:

00 11 * * 4 root test $(date -d 'next Thu' +\%m) -ne $(date +\%m) && /usr/bin/rsnapshot monthly > /backups/rsnapshot_cron.txt 2>&1

Cela fonctionne tous les jeudis et vérifie si la date dans une semaine (604800 secondes) est maintenant identique: sinon, il doit s'agir du dernier jeudi pour que la commande de sauvegarde s'exécute.

AFH
la source
Vous devrez échapper aux signes de pourcentage, comme dans l'exemple du 2e samedi.
Tripleee
Si vous avez la date GNU, elle -d "next thursday" +%mvous permet de sauter une sous-commande imbriquée.
triplee
@tripleee - J'ai testé la commande avec bashUbuntu, et aucune évasion n'a été nécessaire, bien que je ne l'ait pas enregistrée crontab, car le test serait trop difficile. J'imagine que cela serait nécessaire dans un environnement GNU / Windows, mais je changerai de réponse car cela ne peut pas nuire. Merci pour le conseil "jeudi prochain": cela fonctionne sur Ubuntu, je vais donc l'intégrer.
AFH
L’échappement de signes de pourcentage est une exigence spécifique à la crontabsyntaxe; alors oui, cela fonctionnerait à l’invite sans s’échapper.
triplee
Pas le temps de tester ... attendre le jeudi prochain. :)
Danijel