Canalización de salida de wget a / dev / null en cron

39

Ejecuto el siguiente comando cada 5 minutos en mi crontab para mantener vivo a Phusion Passenger.

*/5 * * * * wget mysite.com > /dev/null 2>&1

Cuando ejecuto esto, realiza un wget en las rutas de URL del sitio STDOUT / STDERR a / dev / null. Cuando ejecuto esto desde una línea de comandos, funciona bien y no produce un archivo index.html en mi directorio de inicio.

Cuando se ejecuta desde cron, crea un nuevo archivo index.html cada cinco minutos, dejándome con una tonelada de archivos de índice que no quiero.

¿Mi sintaxis es incorrecta para ejecutar el trabajo cron? Desde una línea de comandos funciona sin problemas, pero desde cron genera un archivo index.html en mi directorio de inicio.

Estoy seguro de que estoy cometiendo un simple error, agradecería si alguien pudiera ayudar.

nulltek
fuente
1
Otra pregunta es por qué esto no crea un archivo cuando lo ejecuta a mano desde la línea de comandos. Por lo que puedo deducir de la documentación, la única diferencia entre ejecutar wgetdesde un terminal y de lo contrario es si se muestra una barra de progreso.
Barmar

Respuestas:

62

Podrías hacerlo así:

*/5 * * * * wget -O /dev/null -o /dev/null example.com

Aquí -Oenvía el archivo descargado /dev/nully -oregistra en /dev/nulllugar de stderr. De esa manera, la redirección no es necesaria en absoluto.

kasperd
fuente
2
Gracias, esto es más directo que redirigir a STDERR / STDOUT. Lo aprecio.
nulltek
17

¿Necesita descargar realmente el contenido o simplemente recibir el 200 OK? Si solo tiene que hacer que el servidor procese la solicitud, ¿por qué no simplemente usar el --spiderargumento?

Nacht - Restablece a Monica
fuente
Eso es un buen pensamiento. Realmente solo necesito la respuesta 200 OK.
nulltek
Esperaba que alguien imparcial lo señalara, pero ... ¿qué solución terminaste usando? Mi respuesta es realmente la forma correcta de hacer esto :)
Nacht - Restablecer Monica
10

Yo usaría lo siguiente:

/5 * * * * wget -O - mysite.com > /dev/null 2>&1

La -O -opción asegura que el contenido obtenido se envíe a stdout.

Peter Lamby
fuente
44
Tenga en cuenta que foo > /dev/null 2>&1se escribe de manera más concisa como foo &> /dev/null.
amalloy
3
@amalloy Solo en bash. En sh, que normalmente es lo que usa cron, el ampersand redirect no funciona.
Soviero
5

Dices que solo necesitas la respuesta "200 OK" en un comentario.

Eso permite una solución con algunas ventajas adicionales sobre las de
wget -O /dev/null -o /dev/null example.com. La idea no es descartar la salida de alguna manera, pero no crear ninguna salida en absoluto.

Que solo necesita la respuesta significa que los datos que se descargan en el archivo local index.html no necesitan descargarse en primer lugar.
En el protocolo HTTP, el comando 'GET' se usa para descargar un documento . Para acceder a un documento de una manera que hace todo excepto descargar el documento, hay un comando especial 'HEAD'.
Cuando se usa 'GET' para esta tarea, el documento se descarga y se descarta localmente. Usar 'HEAD' hace exactamente lo que necesita, no transfiere el documento en primer lugar. Siempre devolverá el mismo código de resultado que 'GET', por definición.

La sintaxis para utilizar el método HEADcon wgetes un poco extraño: tenemos que utilizar la opción --spider. En este contexto, simplemente hace lo que queremos: acceder a la URL con 'HEAD' en lugar de 'GET'.
Podemos usar la opción -q(silencioso) para que wgetno se muestren detalles sobre lo que hace.

Combinando eso, wgetno generará nada en stderr ni guardará un documento.

wget -q --spider 'http://example.com/'

El código de salida nos dice si la solicitud fue exitosa o no:

$ wget -q --spider 'http://example.com/'
$ echo $?
0
$ wget -q --spider 'http://example.com/nonexisting'
$ echo $?                                          
8

Para un comando en crontab, el hecho de que no haya salida en ambos casos significa que puede usar no obtener salida como una indicación de errores nuevamente.

Su comando de ejemplo se cambiaría a esto:

*/5 * * * * wget -q --spider mysite.com

Esto tiene las mismas ventajas que wget -O /dev/null -o /dev/null example.com. La ventaja adicional es que la salida del registro y la salida del documento no se generan, en lugar de generarse y descartarse localmente. O, por supuesto, la gran diferencia es evitar descargar y luego descartar el documento index.html.

Volker Siegel
fuente
También me gusta este enfoque. Agradezco sus comentarios y respuestas.
nulltek
3

para mantener vivo a Phusion Passenger.

Que su pregunta sea sobre esto, la página web dice:

Un servidor web y servidor de aplicaciones rápido y robusto para

Esto no debería requerir ningún script de keepalive.

De lo contrario, la solución de Kasperd es perfecta.

usuario237113
fuente
Gracias por los comentarios, aunque no es muy constructivo. Los servidores de aplicaciones fallan, aunque generalmente no es culpa del contenedor.
Felix Frank
1
Estoy de acuerdo en que no debería requerir ningún cronjobs para mantenerlo vivo. Pero fue una solución rápida mientras investigo el ajuste de Nginx / Passenger. Realmente solo estaba buscando la mejor manera de enviar a / dev / null. He fallado o colgado el pasajero durante 2 minutos a la vez cuando no hay carga, por lo que solicitar la url mantiene al pasajero encendido por ahora.
nulltek
1
Sería bueno entender qué es lo que los wgetcomandos mantienen con vida . En muchas situaciones, la necesidad de mantener los mensajes vivos es un síntoma de un defecto de diseño subyacente que debe corregirse. Pero incluso si todo eso se soluciona, aún quedarán algunos casos en los que un mensaje de mantener vivo es la solución correcta. Incluso si no se necesitan mensajes vivos, el trabajo cron podría ser una parte útil de una configuración de monitoreo.
kasperd
Esto sería mejor como comentario que como respuesta.
moopet el