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 ;-(
    0
    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)
      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. 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. Contributeur
          affiche le résultat de :
          ncal
          entre balises code
          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
              à 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,

                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
                  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. 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. 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
                        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. 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. 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
                              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. 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. 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
                                2. 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
                                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.
                                  0