Peut un script bash dire si elle est en cours d'exécution via cron?
Pas avoir beaucoup de chance Googler cette question et j'ai pensé à poster sur SF, mais il semble en fait comme une question de développement. Si non, n'hésitez pas à migrer.
Donc, j'ai un script qui s'exécute via cron chaque matin, à environ 3 heures du matin. J'ai également exécuter les mêmes scripts manuellement parfois. Le problème est que chaque fois que je lance mon script manuellement, et il échoue, il m'envoie un e-mail, même si je peux le chercher à la sortie et afficher l'erreur dans la console.
Est-il un moyen pour le script bash pour dire qu'il est exécuté par cron (peut-être en utilisant whoami) et seulement envoyer l'e-mail le cas échéant? J'aimerais arrêter de recevoir des e-mails lorsque je fais mes tests...
- Êtes-vous en envoyant un courriel à partir de votre script? Ne pas cron par messagerie par défaut de sortie pour le propriétaire de la crontab?
- Je suis d'e-mailing de l'intérieur, mais j'ai besoin d'envoyer la sortie. Je ne savais pas que cron n'a cette.
- Hey être en utilisant des courriels sortants dans 'mail', pas seulement à l'aide de la messagerie unix système.
Vous devez vous connecter pour publier un commentaire.
vous pouvez essayer "ats" pour voir si il est géré par un terminal ou non. que ne vous dis pas qu'il est spécifiquement exécuté par cron, mais vous pouvez dire si son "pas un utilisateur comme une invite".
vous pouvez également obtenir votre parent pid et la suivre jusqu'à l'arbre à chercher pour cron, même si c'est un peu lourde.
tty -s
dans votre script, et ensuite vérifier$?
: si il est à 0, vous êtes dans un tty, si c'est supérieur à 0, vous ne l'êtes pas.tty
est une commande externe (accordée, une partie de coreutils, mais encore à la fourchette), il y a plusieurs façons d'utiliser builtin des trucs à faire de même décrit dans le unix.stackexchange.com/a/46801/103306Pourquoi ne pas avoir un argument de ligne de commande c'est-à -t pour les tests ou -c pour cron.
Ou mieux encore:
[email protected]
Si il n'est pas spécifié, ne pas envoyer un e-mail.
Voici deux options différentes pour vous:
Prendre l'emailing de votre script/programme et laissez cron gérer. Si vous définissez la variable MAILTO dans votre crontab, cron va envoyer quoi que ce soit imprimé à cette adresse e-mail. par exemple:
Définir une variable d'environnement dans votre crontab qui est utilisé pour déterminer si l'exécution en vertu de cron. par exemple:
et dans votre script quelque chose comme
J'ai eu un problème similaire. Je l'ai résolu en vérifiant si la sortie standard est un terminal. C'est une vérification pour voir si le script s'exécute en mode interactif:
J'ai obtenu ce à partir de: Comment détecter si mon script shell est en cours d'exécution à travers un tuyau?
Le test t de retourner la valeur true si le descripteur de fichier est ouvert et se rapporte à un terminal. "1" la sortie standard stdout.
Je sais que la question est vieux, mais je viens de tomber sur le même problème. C'était ma solution:
puis test avec
même idée que celle que @eruciform mentionné suit est le PID du processus de l'arbre de la vérification de cron.
Remarque: Cette solution ne fonctionne spécifiquement pour cron, contrairement à d'autres solutions qui fonctionnent à chaque fois que le script est exécuté de façon non interactive.
Ce qui fonctionne pour moi est de vérifier
$TERM
. En vertu de cron, il est "stupide", mais sous un shell, c'est autre chose. Utiliser leset
commande dans votre terminal, puis dans un cron-script et check it out[ -n "$TERM" -a "$TERM" == "dumb" ] && echo "interactive" || echo "cron or no tty"
Je voudrais suggérer une nouvelle réponse à cette très voté question. Cela ne fonctionne que sur systemd systèmes avec
loginctl
(par exemple Ubuntu 14.10+, RHEL/CentOS 7+), mais est capable de donner beaucoup plus d'autorité réponse que précédemment présenté des solutions.Pour résumer: lorsqu'il est utilisé avec systemd,
crond
(commesshd
et autres) crée un nouveau session quand il commence un travail pour un utilisateur. Cette session a un ID qui est unique pour l'ensemble de la disponibilité de la machine. Chaque session a certaines propriétés, dont l'un est le nom du service que tout a commencé.loginctl
peut nous dire la valeur de cette propriété, qui sera "crond
" si et seulement si la session a été effectivement commencé par crond.Avantages sur l'utilisation de variables d'environnement:
Avantages des tests pour ats:
Avantages par rapport à la vérification de l'arborescence des processus:
crond
en leur nomJ'ai aussi aimé l'idée de Tal, mais aussi le risque d'avoir renvoie undefined. Je me suis retrouvé avec une version légèrement modifiée, qui semble fonctionner très lisse à mon avis:
CRON="$( pstree -s $$ | grep -c cron )"
De sorte que vous pouvez vérifier pour $CRON étant de 1 ou de 0 à tout moment.