30 votes

Un bash script peut-il dire s'il est exécuté via cron ?

Je n'ai pas eu beaucoup de chance en cherchant cette question sur Google et j'ai pensé la poster sur SF, mais cela semble être une question de développement. Si ce n'est pas le cas, n'hésitez pas à migrer.

Donc, j'ai un script qui s'exécute via cron tous les matins vers 3 heures. Je lance également les mêmes script manuellement parfois. Le problème est que chaque fois que j'exécute mon script manuellement et qu'il échoue, il m'envoie un e-mail ; même si je peux regarder la sortie et visualiser l'erreur dans la console.

Y a-t-il un moyen pour le bash script de dire qu'il est exécuté par cron (peut-être en utilisant whoami) et de n'envoyer l'e-mail que si c'est le cas ? J'aimerais ne plus recevoir d'e-mails lorsque je fais mes tests...

27voto

eruciform Points 5176

Vous pouvez essayer "tty" pour voir s'il est exécuté par un terminal ou non. cela ne vous dira pas s'il est spécifiquement exécuté par cron, mais vous pouvez dire si c'est "pas un utilisateur en tant que prompt".

vous pouvez également obtenir votre parent-pid et le suivre dans l'arbre pour rechercher cron, bien que ce soit un peu lourd.

15voto

shekwi Points 61

J'ai eu un problème similaire. Je l'ai résolu en vérifiant si stdout était un TTY. C'est une vérification pour voir si votre script fonctionne en mode interactif :

if [ -t 1 ] ; then 
    echo "interacive mode";
else
    #send mail
fi

J'ai eu ça de : Comment détecter si mon shell script s'exécute dans un tuyau ?

Le test -t retourne vrai si le descripteur de fichier est ouvert et fait référence à un terminal. '1' est stdout.

10voto

d-_-b Points 2690

Pourquoi ne pas avoir un argument de ligne de commande qui soit -t pour testing ou -c pour cron.

Ou mieux encore :

-e=email@address.com

Si ce n'est pas précisé, n'envoyez pas de courriel.

10voto

Geoff Reedy Points 16508

Voici deux options différentes pour vous :

  • Enlevez l'envoi d'email de votre script/programme et laissez cron s'en occuper. Si vous définissez la variable MAILTO dans votre crontab, cron enverra tout ce qui est imprimé à cette adresse e-mail. ex :

    MAILTO=youremail@example.com
    # run five minutes after midnight, every day
    5 0 * * *       $HOME/bin/daily.job
  • Définissez une variable d'environnement dans votre crontab qui est utilisée pour déterminer si l'exécution se fait sous cron. ex :

    THIS_IS_CRON=1
    # run five minutes after midnight, every day
    5 0 * * *       $HOME/bin/daily.job

    et dans votre script quelque chose comme

    if [ -n "$THIS_IS_CRON" ]; then echo "I'm running in cron"; else echo "I'm not running in cron"; fi

7voto

moonshadow Points 28302

Pas sans aide extérieure, mais il peut dire s'il est exécuté à partir d'un shell interactif, ce qui sera le cas si vous l'exécutez manuellement pour le tester :

if [ -z "$PS1" ]; then
        echo This shell is not interactive
else
        echo This shell is interactive
fi

(Exemple de code tiré de aquí )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X