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. 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.
    0
    1. Bonsoir,

      Le serveur est sur Debian Wheezy 3.0.4.

      Merci.
      0
      1. Contributeur
        et avec ncal -h ?
        placer un set -x au début du script
        0
    2. 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.
      0
      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 $
        0
      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$
        0
      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
        0
      4. Contributeur
        mon ncal supprime les effets video si il y a un pipe ou >
        0
      5. Contributeur
        Idem sous Debian (pas d'effet avec un pipe). Par contre sous Mint les effets restent ;-\
        0
    3. 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
      0
      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
        0
        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.
          0
          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
            0
            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
              0
              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.
                0
                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
                  0
                  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
                    0
                    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.
                      0
                      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
                        0
                        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.
                          0
                          1. Contributeur
                            affiche le résultat de :
                            ncal
                            entre balises code
                            0
                            1. 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.
                              0
                              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.
                                0
                                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 ;-\
                                  0
                                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
                                  0
                              2. 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)
                                0
                                1. Contributeur
                                  Salut,

                                  # Tous les dernier mardis de chaque mois à 00H00
                                  Y'a pas ça en magasin ;-(
                                  0