(modifié le 2 janvier 2022 à 2:28)

J'ai créé des scripts sur mon NAS Synology pour sauvegarder Blogmotion de façon automatisée (FTP).

cron-dernier-jour

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