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

# 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.

Bobot (l’IA à votre service)
  1. Contributeur
    Salut,

    # Tous les dernier mardis de chaque mois à 00H00
    Y'a pas ça en magasin ;-(
    1. Contributeur
      hello
      dans un script à exécuter tous les jours, plutot qu'une ligne cron
      m2 c'est le 2ème mardi du mois, md le dernier
      read m2 md <<<$(ncal | awk '/^Tu/ {print $3, $NF}')
      et on teste avec $(date +%d)
      1. 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.
        1. Contributeur
          mais comment dire à mail d'envoyer l'email quand ce sera le 24 du mois par exemple ?
          En testant en début de script si la date du jour correspond à la valeur renvoyée par la commande de dubcek ;-\
        2. Contributeur
          en exécutant le script tous les jours et en testant si date +%d == $m2 alors deuxième mardi ou == $md dernier mardi
      2. Re,

        Y a un problème ?
        date: opérande supplémentaire « == »
        Saisissez « date --help » pour plus d'informations.

        ncal est en français chez moi
        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:~$


        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.
        1. 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.
          1. 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
            1. 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.
              1. Contributeur
                affiche 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
                1. Contributeur
                  ou 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
                  1. 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.
                    1. Contributeur
                      pour 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
                      1. Contributeur
                        essayer
                        #!/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
                        1. Re,

                          Pour l'instant il me répond :
                          serveur@debian:~$ bash /home/serveur/scripts/crontab/envoi-mail-assoc-mardis.sh
                          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:~$
                          Je n'arrive pas a mettre la date au 24/06/2014 pour faire un test .

                          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.
                          1. Contributeur
                            pour 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
                            1. Contributeur
                              reconnait 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
                              1. 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.
                                1. Contributeur
                                  Salut,

                                  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 $
                                2. Contributeur
                                  effectivement, bien que chez moi:
                                  $ read M2 MD <<<$(ncal | awk -v d=Th '$1 ~ d {print $3, $NF}'); J=$(date +%d)
                                  $ echo $M2 $MD | cat -A
                                  12 26$
                                  $ echo "${M2} ${MD}" | cat -A
                                  12 26$
                                3. Contributeur
                                  Il m'a fallu un moment pour trouver d'où venaient les caractères zarbis ;-\

                                  Voilà ce que me renvoyait le shell (set -x) :
                                  + '[' 26 -eq 12 ']'
                                  + '[' 26 -eq $'_\b2_\b6' ']'
                                  ./plop: ligne 12 : [: 26 : nombre entier attendu comme expression
                                4. Contributeur
                                  mon ncal supprime les effets video si il y a un pipe ou >
                                5. Contributeur
                                  Idem sous Debian (pas d'effet avec un pipe). Par contre sous Mint les effets restent ;-\
                              2. Bonsoir,

                                Le serveur est sur Debian Wheezy 3.0.4.

                                Merci.
                                1. Contributeur
                                  et avec ncal -h ?
                                  placer un set -x au début du script
                              3. Bonjour,

                                Avec :
                                serveur@debian:~$ cat -n /home/serveur/scripts/crontab/envoi-mail-assoc-mardis.sh
                                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:~$
                                Vous remarquerez que j'ai m'y l'option -h à ncal.

                                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 code
                                awk '/^ve/
                                par
                                awk '/^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.