J'ai créé des scripts sur mon NAS Synology pour sauvegarder Blogmotion de façon automatisée (FTP).
Voici mon problème : comment exécuter un script le dernier jour de chaque mois ?
Avec crontab : impossible
J'aurai pu exécuter mes scripts le premier jour de chaque mois (ou avec @monthly) allez-vous me dire ! C'est clair que ça simplifie les choses, mais ne correspond pas à mon besoin. Je veux que mon script exécuté le dernier jour du mois pour que la sauvegarde du mois de "Mars" englobe tout le mois de Mars. Je trouve ça plus logique que d'avoir une sauvegarde qui s'exécuterait le 1er de chaque mois 🙂. Sinon "Avril" contiendrait alors le backup du mois précédent...
A première vue rien de compliqué, sauf que crontab ne permet pas de spécifier l'exécution d'un script le dernier jour de chaque mois. Entre le nombre différent du nombre de jour de chaque mois et les années bissextiles, pas facile.
Chose importante : cette commande fonctionne avec les environnements embarqués (busybox), je l'utilise avec mon routeur sous Tomato.
La solution en commande
Nous allons bien sûr utiliser crontab, mais avec un soupçon de shell à l'intérieur, grâce à cette commande :
[ `/bin/date +%d` -gt `/bin/date -D "%s" -d $(( $(/bin/date +%s ) + 86400 )) +%d` ] && /mon/script
Cette commande vérifie si le numéro du jour et supérieur à celui du jour suivant, si c'est le cas elle lance l'exécution de /mon/script qui va lancer le backup.
Quelques exemples pour bien comprendre :
- nous sommes le 12 avril, le jour suivant est le 13 avril. 12 n'est pas supérieur à 13 : il ne se passera rien
- nous sommes les 30 avril, le jour suivant est le 1er mai. 30 est supérieur à 1 : exécution du script de backup
Pour parvenir à ce script je me suis inspiré de Wikipedia mais la fonction date embarquée dans Synology ne supporte pas "1 day", du coup j'ai mixé avec une info trouvée sur le forum Synology. Et paf, ça fait un beau script qui marche !
En espérant que ce soit utile pour vous !
Ajout du crontab avec un NAS Synology (mode facile)
Pour ajouter la commande dans votre NAS Synology rendez-vous dans la page web d'administration > Panneau de configuration > Planificateur de tâches :
- créer > tâche planifiée > script défini par l'utilisateur
- Tâche: nom au choix
- Utilisateur: admin (ou l'utilisateur de votre choix)
- onglet programmer : quotidienne à 00:01
Puis dans paramètres de tâche :
[ `/bin/date +%d` -gt `date -d "$(/bin/date +%Y-%m-%d) +1 day" +%d` ] && /volume1/homes/admin/script.sh
Astuce : pour lister toutes les tâches planifiées en SSH utilisez synoschedtask --get
Que fait la commande ?
Elle compare le numéro de jour (0..31) pour savoir s'il est plus grand que le numéro du jour +1. Si nous sommes le dernier jour de Janvier :
31/01 > 01/02
Ce n'est pas une bête addition, le système prend en compte le nombre de jour du mois en court (on ne peut pas arriver à 32!).
Ajout du crontab avec un NAS Synology (mode barbu)
Si vous préférez le mode bidouilleur ajoutez la ligne suivante dans le fichier /etc/crontab à l'aide de l'éditeur vi (ou nano si vous avez installé ipkg) :
0 0 28-31 * * root [ `/bin/date +%d` -gt `date -d "$(/bin/date +%Y-%m-%d) +1 day" +%d` ] && /volume1/homes/admin/script.sh
Attention : au lieu d'un espace préférez des tabulations entre chaque valeur du crontab. N'oubliez pas l'espace après "[" et avant "]"
Puis relancer le démon cron (ou redémarrer le NAS Synology) pour la prise en compte :
systemctl restart crond # DSM récent
synoservice -restart crond # vieux DSM
Ajout du crontab avec un routeur Tomato (FreshTomato)
Via la page web d'administration > menu Administration > Scheduler :
Activez "Custom 1" puis :
- Time: 0:30
- Days : cocher tous les jours
- Command: coller le contenu de la commande
De mon côté je préfère faire appel à un script plutôt qu'à directement une commande. J'appelle un script déposé dans la partition JFFS :
/bin/sh /jffs/perso/dernierJour.sh
Ce script se charge d'allumer mon NAS :
[ `/bin/date +%d` -gt `/bin/date -D "%s" -d $(( $(/bin/date +%s ) + 86400 )) +%d` ] && /usr/sbin/ether-wake 00:11:22:33:44:56
Une fois le NAS allumé il lancera l'ordre de sauvegarde à mon serveur Yulpa puis télécharger l'archive (via le planificateur de tâches Synology dans l'interface web).
Note : la commande varie quelque peu car nous sommes sur la commande date de BusyBox
MàJ : script exécuté le 1er du mois
Pour ceux qui préfèrent lancer une action le 1er de chaque mois la commande est d'autant plus simple :
[ `/bin/date +%d` -eq "01" ] && /mon/script
Auteur : Mr Xhark
Fondateur du blog et passionné par les nouvelles techno, suivez-moi sur twitter
5 commentaires
Il fallait y penser 🙂
sinon façon encore plus simple si on est pas à 1 minute prêt,
pourquoi ne pas simplement lancer la tache tout les premiers jours du mois à 00:01 ?
Quand il est aussi possible de faire simple ...
@LePirlouit: car ce billet n'aurait pu exister 🙂
encore plus simple :
et pourquoi pas faire à minuit +1 minute le 1er du mois ? parce que le 1er janvier il ne faut pas oublier de gérer le changement d'année....
Merci, ta commande fonctionne avec mon debian de test mais pas sur mon Tomato (Busybox plus limité), à adapter suivant les cas.
Pour répondre à ta question c'est simplement pour que la sauvegarde porte le nom du mois courant, c'est à dire que mon backup de Janvier correspond effectivement à la fin du mois de janvier. Sinon il serait estampillé février au niveau du nom d'archive et ce serait moins parlant pour moi. Ce n'est qu'une question d'organisation 🙂