Je lis un article sur crontab
Il y a quelque chose à désactiver l'envoi automatique d'e-mails.
Désactiver l'e-mail Par défaut, les tâches cron envoient un e-mail au compte utilisateur exécutant la tâche cron. Si cela n'est pas nécessaire, mettez la commande suivante à la fin de la ligne de travail cron.
>/dev/null 2>&1
Quelle est la signification détaillée de 2
>
&
et 1
? Pourquoi mettre cela à la fin d'un fichier crontab désactiverait l'envoi de courriels?
>
Est pour la redirection
/dev/null
Est un trou noir où toutes les données envoyées seront supprimées
2
Est le descripteur de fichier pour l'erreur standard
>
Est pour la redirection
&
Est le symbole du descripteur de fichier (sans lui, le 1
Suivant serait considéré comme un nom de fichier)
1
Est le descripteur de fichier pour la sortie standard
Par conséquent, >/dev/null 2>&1
Redirige la sortie de votre programme vers /dev/null
. Incluez à la fois Standard Error
Et Standard Out
.
Beaucoup plus d'informations sont disponibles sur la page I/O Redirection de The Linux Documentation Project.
cron
ne vous enverra un e-mail qu'en cas de sortie de votre travail. Avec tout redirigé vers null
, il n'y a pas de sortie et donc cron
ne vous enverra pas d'e-mail.
/dev/null
est un fichier de périphérique qui agit comme un trou noir. Tout ce qui y est écrit, jetez-le ou disparaissez. Lorsque vous exécutez un script qui vous donne une sortie et si nous ajoutons un > /dev/null 2>&1
à la fin du script, nous demandons au script d'écrire tout ce qui est généré à partir du script (à la fois les messages de sortie et d'erreur) dans /dev/null
.
Pour le casser:
2
est le descripteur de l'erreur standard ou STDERR
1
est le descripteur de la sortie standard ou STDOUT
2>&1
demande de diriger tous les STDERR
comme STDOUT
, (c'est-à-dire de traiter tous les messages d'erreur générés à partir du script comme sa sortie standard). Maintenant, nous avons déjà > /dev/null
à la fin du script, ce qui signifie que toute la sortie standard (STDOUT
) sera écrite dans /dev/null
. Puisque STDERR
va maintenant à STDOUT
(à cause de 2>&1
) STDERR
et STDOUT
se retrouvent dans le trou noir /dev/null
. En d'autres termes, le script est réduit au silence.
Soit dit en passant, vous devez avoir un >
devant de /dev/null 2>&1
. Ça devrait être:
x * * * * /path/to/my/script > /dev/null 2>&1
Il s'agit de la redirection d'E/S standard.
Il y a toujours trois fichiers par défaut ouverts.
Dans cet exemple, la sortie standard (1
) est redirigé vers /dev/null
.
Le périphérique null
est un fichier de périphérique qui supprime toutes les données qui y sont écrites.
Ensuite, stderr est alors redirigé vers stdout (2>&1
), par conséquent, stdout et stderr iront à /dev/null
Donc le placer à la fin d'un travail crontab supprimera toutes les sorties et les erreurs de la commande.
Référence
Du manuel cron (8):
Lors de l'exécution des commandes, toute sortie est envoyée au propriétaire de la crontab […].
Donc, ce que votre article suggère ici, c'est de ne produire aucune sortie, donc de ne pas envoyer de courrier. Une autre façon (plus pratique?) De désactiver la messagerie consiste à utiliser le -m off
option, c'est-à-dire.
crond -m off
Passons maintenant à la syntaxe: elle est spécifique au langage Bourne Shell (et à ses dérivés tels que bash
, zsh
, etc.).
[n]>file
[n]>fd
redirigera vers le descripteur de fichier n
(ou la sortie standard si non spécifié) vers le descripteur de fichier fd
.
Un descripteur de fichier peut être un nom de fichier de l'adresse d'un flux. &
est l'opérateur d'adresse comme dans le langage C.
Classiquement, le descripteur de fichier 1
est la sortie standard (a.k.a. stdout) et le descripteur de fichier 2
est une erreur standard (a.k.a. stderr). Le morceau
>/dev/null
redirige stdout vers/dev/null.
'2>&1'
redirige le flux d'erreurs vers le flux de sortie, qui a été redirigé vers/dev/null. En tant que tel, aucune sortie n'est produite et aucun courrier n'est envoyé.
Attention: l'ordre de redirection est important:
>/dev/null 2>&1
n'est pas la même chose que
2>&1 >/dev/null
Essayez ces deux commandes avec un utilisateur non privilégié:
ls >/dev/null 2>&1
ls 2>&1 >/dev/null
En effet, dans le dernier cas, le descripteur de fichier 2
est défini à l'adresse actuelle du descripteur de fichier `` 1 (qui est stdout en ce moment même), puis le descripteur de fichier 1
est redirigé vers /dev/null
. Descripteur de fichier 2
est toujours redirigé vers stdout, quoi qu'il arrive au descripteur de fichier 1
.
Normalement, lorsque cron
exécute un cronjob, il envoie la sortie de la commande donnée dans le cronjob au compte utilisateur exécutant le cronjob. Ainsi, lorsque votre cronjob exécute uptime
par exemple, la sortie de uptime
est envoyée à l'utilisateur par e-mail.
Pour être clair, la sortie standard (stdout
) de la commande signifie. Maintenant, si vous exécutez la commande uptime
dans le cornjob comme suit:
uptime >/dev/null 2>&1
2>&1
signifie une redirection du canal 2 (stderr
) vers le canal 1 (stdout
). Les deux sorties sont maintenant sur le même canal (1
).>/dev/null
: signifie que la sortie standard (et la sortie d'erreur standard) est envoyée à /dev/null
. /dev/null
est un fichier spécial:Les données écrites dans un fichier spécial nul ou nul sont supprimées.
Donc, vous supprimez la sortie et cron n'a rien à envoyer.
Le manuel de référence de Redirection Bash dit:
L'opérateur [n]> & Word est utilisé [...] pour dupliquer les descripteurs de fichiers de sortie. Pour rediriger stderr et stdout vers un fichier, vous devez utiliser le formulaire &> fichier ....
brièvement: tous les messages STDERR et STDOUT seront redirigés vers /dev/null