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.

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

Kasperd
fonte
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?

Nacht - Restabelecer Monica
fonte
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.

Peter Lamby
fonte
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,.

Volker Siegel
fonte
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.

user237113
fonte
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