Piping a saída do wget para / dev / null no cron


39

Estou executando o seguinte comando a cada 5 minutos no meu crontab para manter o Phusion Passenger vivo.

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

Quando executo isso, ele executa um wget nas rotas de URL do site STDOUT / STDERR para / dev / null. Quando executo isso a partir de uma linha de comando, ele funciona bem e não produz um arquivo index.html no meu diretório pessoal.

Quando executado a partir do cron, ele cria um novo arquivo index.html a cada cinco minutos, deixando-me com uma tonelada de arquivos de índice que eu não quero.

Minha sintaxe está incorreta para executar o trabalho cron? A partir de uma linha de comando, ele funciona sem problemas, mas a partir do cron gera um arquivo index.html no meu diretório pessoal.

Tenho certeza de que estou cometendo um erro simples, agradeceria se alguém pudesse ajudar.


1
Outra pergunta é por que isso não está criando um arquivo quando você o executa a partir da linha de comando manualmente. Tanto quanto posso constatar na documentação, a única diferença entre executar a wgetpartir de um terminal e o contrário é se uma barra de progresso é exibida.
Barmar 12/08/2014

Respostas:


62

Você poderia fazer assim:

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

Aqui -Oenvia o arquivo baixado para /dev/nulle -oregistra para, em /dev/nullvez de stderr. Dessa forma, o redirecionamento não é necessário.


2
Obrigado, isso é mais direto do que o redirecionamento para STDERR / STDOUT. Eu agradeço.
Nulltek

17

Você realmente precisa baixar o conteúdo ou apenas receber o 200 OK? Se você precisa apenas que o servidor processe a solicitação, por que não usar simplesmente o --spiderargumento?


Esse é um bom pensamento. Eu realmente só preciso da resposta 200 OK.
Nulo16 de

Eu esperava que alguém imparcial apontasse, mas ... que solução você acabou usando? Minha resposta é realmente a maneira correta de fazer isso :) #
Nacht - Reinstate Monica

10

Eu usaria o seguinte:

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

A -O -opção garante que o conteúdo buscado seja enviado ao stdout.


4
Note que foo > /dev/null 2>&1está escrito de forma mais concisa como foo &> /dev/null.
precisa saber é

3
@amalloy Apenas em bash. Em sh, que geralmente é o que o cron usa, o redirecionamento e comercial não funciona.
Soviero

5

Você diz que precisa apenas da resposta "200 OK" em um comentário.

Isso permite a solução com algumas vantagens adicionais sobre as de
wget -O /dev/null -o /dev/null example.com. A idéia não é descartar a saída de alguma forma, mas não criar nenhuma saída.

O fato de você precisar apenas da resposta significa que os dados baixados no arquivo local index.html não precisam ser baixados em primeiro lugar.
No protocolo HTTP, o comando 'GET' é usado para baixar um documento . Para acessar um documento de uma maneira que faça tudo, exceto o download do documento, existe um comando especial 'HEAD'.
Ao usar 'GET' para esta tarefa, o documento é baixado e descartado localmente. Usar 'HEAD' faz exatamente o que você precisa; ele não transfere o documento em primeiro lugar. Sempre retornará o mesmo código de resultado que 'GET', por definição.

A sintaxe para usar o método HEADcomwget é um pouco estranho: é preciso usar a opção --spider. Nesse contexto, ele apenas faz o que queremos - acesse a URL com 'HEAD' em vez de 'GET'.
Podemos usar a opção -q(quiet) para wgetnão produzir detalhes sobre o que ele faz.

Combinando isso, wget não produzirá nada para stderr nem salvará um documento.

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

O código de saída informa se a solicitação foi bem-sucedida ou não:

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

Para um comando in crontab, o fato de não haver saída nos dois casos significa que você pode usar a obtenção de saída como uma indicação de erros novamente.

Seu comando de exemplo seria alterado para isso:

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

Isso tem as mesmas vantagens que wget -O /dev/null -o /dev/null example.com. A vantagem adicional é que a saída do log e a saída do documento não são geradas, em vez de geradas e descartadas localmente. Ou é claro que a grande diferença é evitar o download e descartar o documento index.html,.


Eu também gosto dessa abordagem. Agradeço seu feedback e resposta.
Nulo17

3

para manter o Phusion Passenger vivo.

Que sua dúvida seja sobre isso, a página diz:

Um servidor da Web e servidor de aplicativos rápido e robusto para

Isso não deve exigir scripts de manutenção de atividade.

Caso contrário, a solução da Kasperd é perfeita.


Obrigado pelo feedback, embora não seja muito construtivo. Os servidores de aplicativos falham - embora geralmente não seja culpa do contêiner.
Felix Frank

1
Concordo que não deve exigir cronjobs para mantê-lo vivo. Mas foi uma solução rápida enquanto eu pesquisava o ajuste do Nginx / Passenger. Estava realmente apenas procurando a melhor maneira de gerar saída para / dev / null. Eu tive passageiros falhando ou travando por 2 minutos em um momento em que não há carga, portanto, solicitar o URL mantém o passageiro demitido por enquanto.
Nulo16 de

1
Seria bom entender o que é que está sendo mantido vivo pelos wgetcomandos. Em muitas situações, a necessidade de manter mensagens vivas é um sintoma de uma falha de design subjacente que deve ser corrigida. Mas mesmo se todos eles forem corrigidos, ainda haverá alguns casos em que uma mensagem keep alive é a solução certa. Mesmo que as mensagens keep alive não sejam necessárias, o trabalho cron ainda pode ser uma parte útil de uma configuração de monitoramento.
kasperd

Isso seria melhor como comentário do que como resposta.
moopet
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.