web-dev-qa-db-fra.com

Que signifie «> / dev / null 2> & 1» dans cet article sur les bases de crontab?

Je lis un article sur crontab

Il y a quelque chose à désactiver l'envoi automatique d'e-mails.

  1. 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?

146
AGamePlayer

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

226
garethTheRed

/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
46
Sree

Il s'agit de la redirection d'E/S standard.

Il y a toujours trois fichiers par défaut ouverts.

  • stdin (0)
  • stdout (1)
  • stderr (2)

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

Redirection d'E/S

14
geedoubleya

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.

8
Ambrevar

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.

2
chaos

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

1
arash javan