O que significa '/ dev / null 2 & 1' neste artigo de noções básicas de crontab? [duplicado]

107

Estou lendo um artigo sobre o crontab

Há algo em desativar o envio automático de e-mails.

  1. Disable Email By default cron jobs sends an email to the user account executing the cronjob. If this is not needed put the following command At the end of the cron job line.

    >/dev/null 2>&1
    

Qual é o significado detalhado de 2 > & e 1 ? Por que colocar isso no final de um arquivo crontab desativaria o envio de email?

    
por AGamePlayer 21.10.2014 / 14:59

6 respostas

165

> é para redirecionar

/dev/null é um buraco negro onde qualquer dado enviado será descartado

2 é o descritor de arquivo para o erro padrão

> é para redirecionar

& é o símbolo para o descritor de arquivo (sem ele, o seguinte 1 seria considerado um nome de arquivo)

1 é o descritor de arquivo para saída padrão

Portanto, >/dev/null 2>&1 está redirecionando a saída do seu programa para /dev/null . Inclua os Standard Error e Standard Out .

Mais informações estão disponíveis na página de Redirecionamento de E / S do Projeto de Documentação do Linux . .

cron enviará um e-mail somente se houver alguma saída do seu trabalho. Com tudo redirecionado para null , não há saída e, portanto, cron não enviará um e-mail para você.

    
por 21.10.2014 / 15:13
40

/dev/null é um arquivo de dispositivo que age como um blackhole. O que quer que esteja escrito, seja descartado ou desapareça. Quando você executa um script que fornece uma saída e se adicionarmos > /dev/null 2>&1 no final do script, estamos solicitando que o script escreva o que é gerado a partir do script (as mensagens de saída e de erro) para /dev/null .

Para dividir:

  • 2 é o identificador do erro padrão ou STDERR
  • 1 é o identificador da saída padrão ou STDOUT

2>&1 está pedindo para direcionar todo o STDERR como STDOUT , (ou seja, para tratar todas as mensagens de erro geradas a partir do script como sua saída padrão). Agora, já temos > /dev/null no final do script, o que significa que toda a saída padrão ( STDOUT ) será gravada em /dev/null . Como STDERR agora está indo para STDOUT (por causa de 2>&1 ), ambos STDERR e STDOUT terminam no blackhole /dev/null . Em outras palavras, o script é silenciado.

A propósito, você precisa ter um > na frente de /dev/null 2>&1 . Deve ser:

x * * * * /path/to/my/script > /dev/null 2>&1
    
por 21.10.2014 / 15:18
13

Este é o redirecionamento padrão de E / S.

Existem sempre três arquivos padrão abertos.

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

Portanto, neste exemplo, o stdout ( 1 ) está sendo redirecionado para /dev/null .

O dispositivo null é um arquivo de dispositivo que descarta todos os dados gravados nele.

Então stderr está sendo redirecionado para stdout ( 2>&1 ), portanto stdout e stderr irão para /dev/null

Portanto, colocar isso no final de um trabalho de crontab suprimirá todas as saídas e erros do comando.

Referência

Redirecionamento de E / S

    
por 21.10.2014 / 15:13
6

Do manual cron (8) :

When executing commands, any output is mailed to the owner of the crontab […].

Portanto, o que seu artigo sugere aqui é não produzir nenhuma saída, não enviando nenhum email. Outra maneira (mais conveniente?) Para desabilitar o e-mail é usar a opção -m off , ou seja,

crond -m off

Agora, para a sintaxe: isso é específico para a linguagem de shell Bourne (e seus derivados, como bash , zsh e assim por diante).

[n]>file

[n]>fd

redirecionará para o descritor de arquivo n (ou saída padrão, se não especificado) para o descritor de arquivo fd .

Um descritor de arquivo pode ser um nome de arquivo do endereço de um fluxo. & é o operador de endereço como na linguagem C.

Convencionalmente, o descritor de arquivo 1 é a saída padrão (a.k.a. stdout ) e o descritor de arquivo 2 é o erro padrão (a.k.a. stderr ). O pedaço

>/dev/null

está redirecionando stdout para / dev / null.

'2>&1'

está redirecionando o fluxo de erro para o fluxo de saída, que foi redirecionado para / dev / null. Como tal, nenhuma saída é produzida e nenhum email é enviado.

Aviso: a ordem de redirecionamento é importante:

>/dev/null 2>&1

não é o mesmo que

2>&1 >/dev/null

Tente estes dois comandos com um usuário não privilegiado:

ls >/dev/null 2>&1
ls 2>&1 >/dev/null

De fato, no último caso, o descritor de arquivo 2 é configurado para o endereço atual do descritor de arquivo '' 1 (que é stdout neste exato momento) e, em seguida, o descritor de arquivo 1 é redirecionado para /dev/null . O descritor de arquivo 2 ainda é redirecionado para stdout , não importa o que aconteça ao descritor de arquivo 1 .

    
por 21.10.2014 / 16:07
2

Normalmente, quando cron executa um cronjob, envia a saída do comando fornecido no cronjob para a conta de usuário que está executando o cronjob. Então, quando o seu cronjob executa uptime , por exemplo, a saída de uptime é enviada ao usuário por e-mail.

Para ficar claro, a saída padrão ( stdout ) do comando é utilizada. Agora, se você executar o comando uptime no cornjob da seguinte forma:

uptime >/dev/null 2>&1
  • 2>&1 significa um redirecionamento do canal 2 ( stderr ) para o canal 1 ( stdout ). Ambas as saídas estão agora no mesmo canal ( 1 ).
  • >/dev/null : significa que a saída padrão (e a saída de erro padrão) é enviada para /dev/null . /dev/null é um arquivo especial:

Data written to a null or zero special file is discarded.

Então, você descarta a saída e o cron não tem nada para enviar.

    
por 21.10.2014 / 15:14
1

O manual de referência do Redirection Bash diz:

The operator [n]>&word is used [...] to duplicate output file descriptors To redirect both stderr and stdout to file you should use the form &>file ....

resumidamente: todas as mensagens STDERR e STDOUT serão redirecionadas para /dev/null

    
por 21.10.2014 / 15:11

Tags