Crontab
Résolu
Bonjour,
Je voudrais recevoir une alerte via crontab
* Tous les 2em mardis de chaque mois.
* Tous les dernier mardis de chaque mois.
Personnellement je n'ai pas trouvé la bonne formule dans crontab
Merci.
Je voudrais recevoir une alerte via crontab
* Tous les 2em mardis de chaque mois.
* Tous les dernier mardis de chaque mois.
Personnellement je n'ai pas trouvé la bonne formule dans crontab
# Tous les 2em mardis de chaque mois à 00H00
00 00 2-7 * 2 bash /home/serveur/scripts/crontab/envoi-mail-assoc-deuxieme-mardis.sh
# Tous les dernier mardis de chaque mois à 00H00
Je n'arrive pas a trouvé la formule
Merci.
19 réponses
Résumé de la discussion
La discussion porte sur la mise en place d’alertes crontab pour déclencher un script tous les deuxièmes mardis et tous les derniers mardis de chaque mois sous Linux. Les solutions centrales reposent sur l’utilisation de ncal et awk pour calculer les dates du 2e mardi et du dernier mardi, puis comparer le jour courant (date +%d) via des tests. Plusieurs propositions utilisent -h avec ncal, ou écrivent le calcul dans un script Bash lisant M2 et MD et utilisant if/elif ou case pour afficher «2eme mardi» ou «dernier mardi». Des variantes soulignent aussi l’importance de la locale et de tests concrets pour éviter des erreurs de comparaison et garantir une marge de sécurité dans le cron.
-
ContributeurSalut,
# Tous les dernier mardis de chaque mois à 00H00
Y'a pas ça en magasin ;-(
-
Contributeurhello
dans un script à exécuter tous les jours, plutot qu'une ligne cron
m2 c'est le 2ème mardi du mois, md le dernierread m2 md <<<$(ncal | awk '/^Tu/ {print $3, $NF}')
et on teste avec $(date +%d) -
Bonjour,
Avec :read m2 md <<<$(ncal | awk '/^Tu/ {print $3, $NF}')
echo "Le dernier mardi du mois de $(date +%B) est le : $(date +%d)"
Résultat :serveur@debian:~$ bash /home/serveur/scripts/crontab/envoi-mail-assoc-dernier-mardis.sh
Le dernier mardi du mois de juin est le : 24
serveur@debian:~$
Ok mais comment dire à mail d'envoyer l'email quand ce sera le 24 du mois par exemple ?
message="Le corps du message"
sujet="Le sujet du message"
destinataire="mail.mail@fai.fr"
echo "$message" | mail -v -s "$sujet" $fichier $destinataire
Merci. -
Re,
Y a un problème ?date: opérande supplémentaire « == »
Saisissez « date --help » pour plus d'informations.
ncal est en français chez moiserveur@debian:~$ ncal
Juin 2014
lu 2 9 16 23 30
ma 3 10 17 24
me 4 11 18 25
je 5 12 19 26
ve 6 13 20 27
sa 7 14 21 28
di 1 8 15 22 29 serveur@debian:~$
Test :serveur@debian:~$ ncal | awk '/^ma/ {print $3, $NF}'
10 24
serveur@debian:~$
Avec :read m2 md <<<$(ncal | awk '/^ma/ {print $3, $NF}')
echo "Le 2em mardi du mois de $(date +%B) est : $m2" #$(date +%d)"
echo "Le dernier mardi du mois de $(date +%B) est : $md" #$(date +%d)"
echo
echo "2em mardis de chaque mois : date +%d == $m2"
date +%d == $m2
echo
echo "Dernier mardis de chaque mois : date +%d == $md"
date +%d == $md
Résultat :serveur@debian:~$ bash /home/serveur/scripts/crontab/envoi-mail-assoc-mardis.sh
Le 2em mardi du mois de juin est : 10
Le dernier mardi du mois de juin est : 24
2em mardis de chaque mois : date +%d == 10
date: opérande supplémentaire « == »
Saisissez « date --help » pour plus d'informations.
Dernier mardis de chaque mois : date +%d == 24
date: opérande supplémentaire « == »
Saisissez « date --help » pour plus d'informations.
serveur@debian:~$
Merci. -
Contributeuraffiche le résultat de :
ncal
entre balises code -
Re,
Voilà le résultat :serveur@debian:~$ ncal
Juin 2014
lu 2 9 16 23 30
ma 3 10 17 24
me 4 11 18 25
je 5 12 19 26
ve 6 13 20 27
sa 7 14 21 28
di 1 8 15 22 29
serveur@debian:~$serveur@debian:~$ date
mardi 24 juin 2014, 14:27:43 (UTC+0200)
serveur@debian:~$serveur@debian:~$ date +%d == 24
date: opérande supplémentaire « == »
Saisissez « date --help » pour plus d'informations.
serveur@debian:~$
Merci. -
Contributeurà exécuter chaque jour
#!/bin/bash
read M2 MD <<<$(ncal | awk '/^ma/ {print $3, $NF}'); J=$(date +%d)
if [ $J -eq $M2 ]; then
echo 2eme mardi
else
if [ $J -eq $MD ]; then
echo dernier mardi
else
echo journée banale et affligeante
fi
fi -
Re,
Heu y a une erreur !/home/serveur/scripts/crontab/envoi-mail-assoc-mardis.sh: ligne 26 : [: 24 : nombre entier attendu comme expression
Avec :read M2 MD <<<$(ncal | awk '/^ma/ {print $3, $NF}'); J=$(date +%d)
if [ $J -eq $M2 ]; then
echo 2eme mardi
else
if [ $J -eq $MD ]; then
echo dernier mardi
else
echo journée banale et affligeante
fi
fi
Le résultat est :serveur@debian:~$ bash /home/serveur/scripts/crontab/envoi-mail-assoc-mardis.sh
/home/serveur/scripts/crontab/envoi-mail-assoc-mardis.sh: ligne 26 : [: 24 : nombre entier attendu comme expression
journée banale et affligeante
serveur@debian:~$
Merci. -
Contributeuraffiche les lignes numérotées pour voir la 26
chez moi$ head -13 f1
#!/bin/bash
read M2 MD <<<$(ncal | awk '/^Tu/ {print $3, $NF}'); J=$(date +%d)
if [ $J -eq $M2 ]; then
echo 2eme mardi
else
if [ $J -eq $MD ]; then
echo dernier mardi
else
echo journée banale et affligeante
fi
fi
$ ./f1
dernier mardi -
Contributeurou essayer avec case
read M2 MD <<<$(ncal | awk '/^ma/ {print $3, $NF}'); J=$(date +%d)
case $J in
$M2) echo 2eme mardi ;;
$MD) echo dernier mardi ;;
*) echo journée banale et affligeante ;;
esac -
Re,
Les cases doivent être écrit en dur il me semble.
mais ça marche pas nom plus.
Avec :read M2 MD <<<$(ncal | awk '/^ma/ {print $3, $NF}'); J=$(date +%d)
echo "J - Nous somme le : $J"
echo "M2 - Le 2em mardi de ce mois est le : $M2"
echo "MD - Le dernier mardi de ce mois est le : $MD"
echo
case $J in
$M2) echo 2eme mardi ;;
$MD) echo dernier mardi ;;
*) echo journée banale et affligeante ;;
esac
Résultat :serveur@debian:~$ bash /home/serveur/scripts/crontab/envoi-mail-assoc-mardis.sh
J - Nous somme le 24
M2 - Le 2em mardi de ce mois est le : 10
MD - Le dernier mardi de ce mois est le : 24
journée banale et affligeante
serveur@debian:~$
Je pense que la meilleure solution était votre avant dernier code.
Mais qu'est-ce qui fait qui nous différents si le résultat du code ?
Merci. -
Contributeurpour l'avant dernier code, montre les lignes numérotées, pour voir la 26
quel système ?
si je change ^ma par ^We (je laisse mardi dans les echo) ca marche avec le code précédent, on est bien le dernier We du mois$ ./f1
J - Nous somme le : 25
M2 - Le 2em mardi de ce mois est le : 11
MD - Le dernier mardi de ce mois est le : 25
dernier mardi -
Contributeuressayer
#!/bin/bash
read M2 MD <<<$(ncal | awk '/^ma/ {print $3, $NF}'); J=$(date +%d)
if [ $J -eq $M2 ]; then
echo 2eme mardi
elif [ $J -eq $MD ]; then
echo dernier mardi
else
echo journée banale et affligeante
fi -
Re,
Pour l'instant il me répond :serveur@debian:~$ bash /home/serveur/scripts/crontab/envoi-mail-assoc-mardis.sh
Je n'arrive pas a mettre la date au 24/06/2014 pour faire un test .
J - Nous somme le : 25
M2 - Le 2em mardi de ce mois est le : 10
MD - Le dernier mardi de ce mois est le : 24
journée banale et affligeante
serveur@debian:~$
Date actuel :serveur@debian:~$ date
mercredi 25 juin 2014, 17:07:37 (UTC+0200)
serveur@debian:~$
Impossible de modifier la date :root@debian:/home/serveur# date -s "24/06/2014"
date: date non valide « 24/06/2014 »
root@debian:/home/serveur#
Merci. -
Contributeurpour la date essayer: date -s "6/24/2014"
pour tester changer le jour dans le awk (^ma) plutot que changer la date du système, on est à la fin du mois, dernier jeudi -
Contributeurreconnait le jour:
#!/bin/bash
s=(lundi mardi mercredi jeudi vendredi samedi dimanche)
#wd=(Mo Tu We Th Fr Sa Su)
wd=(lu ma me je ve sa di)
j=${s[$(date +%u)-1]}; d=${wd[$(date +%u)-1]} ;
read M2 MD <<<$(ncal | awk -v d=$d '$1 ~ d {print $3, $NF}'); J=$(date +%d)
if [ $J -eq $M2 ]; then
echo 2eme $j
elif [ $J -eq $MD ]; then
echo dernier $j
else
echo journée banale et affligeante
fi -
Bonjour,
Mon os est : Kubuntu 12.04.4 LTS.
Je n'y avais pas pensé de changer dans le awk (^ma) plutot que de changer la date du système.
Avec :serveur@debian:~$ cat -n /home/serveur/scripts/crontab/envoi-mail-assoc-mardis.sh
1 #!/bin/bash
2
3
4
5
6 read M2 MD <<<$(ncal | awk '/^je/ {print $3, $NF}'); J=$(date +%d)
7 echo "J - Nous somme le : $J"
8 echo "M2 - Le 2em mardi de ce mois est le : $M2"
9 echo "MD - Le dernier mardi de ce mois est le : $MD"
10 echo
11
12 read M2 MD <<<$(ncal | awk '/^je/ {print $3, $NF}'); J=$(date +%d)
13 if [ $J -eq $M2 ]; then
14 echo 2eme mardi
15 elif [ $J -eq $MD ]; then
16 echo dernier mardi
17 else
18 echo journée banale et affligeante
19 fi
serveur@debian:~$
j'ai ce message d'erreur :serveur@debian:~$ bash /home/serveur/scripts/crontab/envoi-mail-assoc-mardis.sh
J - Nous somme le : 26
M2 - Le 2em mardi de ce mois est le : 12
MD - Le dernier mardi de ce mois est le : 26
/home/serveur/scripts/crontab/envoi-mail-assoc-mardis.sh: ligne 15 : [: 26 : nombre entier attendu comme expression
journée banale et affligeante
serveur@debian:~$
2em test
Et avec ce code :serveur@debian:~$ cat -n /home/serveur/scripts/crontab/envoi-mail-assoc-mardis.sh
1 #!/bin/bash
2
3
4 s=(lundi mardi mercredi jeudi vendredi samedi dimanche)
5 #wd=(Mo Tu We Th Fr Sa Su)
6 wd=(lu ma me je ve sa di)
7 j=${s[$(date +%u)-1]}; d=${wd[$(date +%u)-1]} ;
8 read M2 MD <<<$(ncal | awk -v d=$d '$1 ~ d {print $3, $NF}'); J=$(date +%d)
9 if [ $J -eq $M2 ]; then
10 echo 2eme $j
11 elif [ $J -eq $MD ]; then
12 echo dernier $j
13 else
14 echo journée banale et affligeante
15 fi
16 echo "J - Nous somme le : $J"
17 echo "M2 - Le 2em mardi de ce mois est le : $M2"
18 echo "MD - Le dernier mardi de ce mois est le : $MD"
19 echo
20
21
22 exit 0
Avec comme retour :serveur@debian:~$ bash /home/serveur/scripts/crontab/envoi-mail-assoc-mardis.sh
/home/serveur/scripts/crontab/envoi-mail-gullivar-mardis.sh: ligne 34 : [: 26 : nombre entier attendu comme expression
journée banale et affligeante
J - Nous somme le : 26
M2 - Le 2em mardi de ce mois est le : 12
MD - Le dernier mardi de ce mois est le : 26
serveur@debian:~$
Je n'arrive pas a comprendre pourquoi chez vous ça marche et chez moi non ????
Merci.-
ContributeurSalut,
Rajoute l'option "-h" àncal
.
Voilà comment est vue ta variable $MD :$ echo "${MD}" | cat -A
_^H2_^H6$
Ci-dessous la différence sans et avec l'option -h :
$ ncal | cat -A
Juin 2014 $
lu 2 9 16 23 30$
ma 3 10 17 24 $
me 4 11 18 25 $
je 5 12 19 _^H2_^H6 $
ve 6 13 20 27 $
sa 7 14 21 28 $
di 1 8 15 22 29 $
$ ncal -h | cat -A
Juin 2014 $
lu 2 9 16 23 30$
ma 3 10 17 24 $
me 4 11 18 25 $
je 5 12 19 26 $
ve 6 13 20 27 $
sa 7 14 21 28 $
di 1 8 15 22 29 $ -
-
-
-
-
-
Bonsoir,
Le serveur est sur Debian Wheezy 3.0.4.
Merci. -
Bonjour,
Avec :serveur@debian:~$ cat -n /home/serveur/scripts/crontab/envoi-mail-assoc-mardis.sh
Vous remarquerez que j'ai m'y l'option -h à ncal.
1 #!/bin/bash
2
3
4 read M2 MD <<<$(ncal -h | awk '/^ve/ {print $3, $NF}'); J=$(date +%d)
5 if [ $J -eq $M2 ]; then
6 echo 2eme mardi
7 else
8 if [ $J -eq $MD ]; then
9 echo dernier mardi
10 else
11 echo journée banale et affligeante
12 fi
13 fi
14 echo
15 echo "J - Aujourd'hui nous sommes le : $J"
16 echo "M2 - Le 2em mardi de ce mois est le : $M2"
17 echo "MD - Le dernier mardi de ce mois est le : $MD"
18 echo
19
20 exit 0
serveur@debian:~$
Il m'affiche correctement que nous sommes le dernier Vendredi du mois.serveur@debian:~$ bash /home/serveur/scripts/crontab/envoi-mail-assoc-mardis.sh
dernier mardi
J - Aujourd'hui nous sommes le : 27
M2 - Le 2em mardi de ce mois est le : 13
MD - Le dernier mardi de ce mois est le : 27
serveur@debian:~$
Si je remplace dans le codeawk '/^ve/
parawk '/^ma/
il me retourne :
serveur@debian:~$ bash /home/serveur/scripts/crontab/envoi-mail-assoc-mardis.sh
journée banale et affligeante
J - Aujourd'hui nous sommes le : 27
M2 - Le 2em mardi de ce mois est le : 10
MD - Le dernier mardi de ce mois est le : 24
serveur@debian:~$
Je pense que c'est bon maintenant.
Merci.