Piping de la sortie wget vers / dev / null dans cron

39

J'exécute la commande suivante toutes les 5 minutes dans ma crontab pour maintenir Phusion Passenger en vie.

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

Quand j'exécute ceci, il effectue un wget sur l'url du site et achemine STDOUT / STDERR vers / dev / null. Lorsque j'exécute cette commande à partir d'une ligne de commande, cela fonctionne correctement et ne génère pas de fichier index.html dans mon répertoire personnel.

Lorsqu'il est exécuté à partir de cron, il crée un nouveau fichier index.html toutes les cinq minutes, me laissant ainsi une tonne de fichiers d'index que je ne souhaite pas.

Ma syntaxe est-elle incorrecte pour l'exécution du travail cron? A partir d'une ligne de commande, cela fonctionne sans problème, mais à partir de cron, il génère un fichier index.html dans mon répertoire personnel.

Je suis sûr que je fais une simple erreur, je serais reconnaissant si quelqu'un pouvait aider.

nulltek
la source
1
Une autre question est de savoir pourquoi cela ne crée pas un fichier lorsque vous l'exécutez à partir de la ligne de commande à la main. Pour autant que je sache dans la documentation, la seule différence entre exécuter à wgetpartir d'un terminal et le reste est si une barre de progression est affichée.
Barmar

Réponses:

62

Vous pouvez le faire comme ceci:

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

Ici -Oenvoie le fichier téléchargé à /dev/nullet se -oconnecte à la /dev/nullplace de stderr. De cette façon, la redirection n'est pas du tout nécessaire.

Kasperd
la source
2
Merci, cela est plus direct que la redirection vers STDERR / STDOUT. Je vous en suis reconnaissant.
nulltek
17

Devez-vous réellement télécharger le contenu ou simplement recevoir le 200 OK? Si vous devez seulement que le serveur traite la demande, pourquoi ne pas simplement utiliser l' --spiderargument?

Nacht - Rétablir Monica
la source
C'est une bonne pensée. Je n'ai vraiment besoin que de la réponse 200 OK.
nulltek
J'espérais qu'une personne impartiale le signalerait, mais ... quelle solution avez-vous utilisée? Ma réponse est vraiment la bonne façon de faire :)
Nacht - Réintégrer Monica
10

Je voudrais utiliser les éléments suivants:

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

L' -O -option permet de s'assurer que le contenu récupéré est envoyé à stdout.

Peter Lamby
la source
4
Notez que l’ foo > /dev/null 2>&1écriture est plus concise foo &> /dev/null.
Amalloy
3
@alloy Seulement dans bash. Dans sh, qui est généralement utilisé par cron, la redirection esperluette ne fonctionne pas.
Soviero
5

Vous dites que vous avez uniquement besoin de la réponse "200 OK" dans un commentaire.

Cela permet une solution avec des avantages supplémentaires par rapport à ceux de
wget -O /dev/null -o /dev/null example.com. L'idée n'est pas de supprimer la sortie d'une certaine manière, mais de ne créer aucune sortie du tout.

Le fait que vous n'ayez besoin que de la réponse signifie que les données téléchargées dans le fichier local index.html n'ont pas besoin d'être téléchargées en premier lieu.
Dans le protocole HTTP, la commande 'GET' est utilisée pour télécharger un document . Pour accéder à un document de manière à tout faire sauf le télécharger, il existe une commande spéciale "HEAD".
Lorsque vous utilisez «GET» pour cette tâche, le document est téléchargé et supprimé localement. Utiliser "HEAD" fait exactement ce dont vous avez besoin, il ne transfère pas le document en premier lieu. Il retournera toujours le même code de résultat que "GET", par définition.

La syntaxe à utiliser la méthode HEADavecwget est un peu étrange: nous avons besoin d'utiliser l'option --spider. Dans ce contexte, il fait juste ce que nous voulons - accédez à l'URL avec "HEAD" au lieu de "GET".
Nous pouvons utiliser l’option -q(quiet) pour ne wgetpas afficher les détails de ce qu’elle fait.

Combinant cela, wget ne produira rien dans stderr, ni ne sauvera un document.

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

Le code de sortie nous indique si la demande a abouti ou non:

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

Pour une commande dans crontab, le fait qu'il n'y ait pas de sortie dans les deux cas signifie que vous pouvez utiliser obtenir l'absence de sortie pour indiquer à nouveau des erreurs.

Votre exemple de commande serait changé en ceci:

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

Cela a les mêmes avantages que wget -O /dev/null -o /dev/null example.com. L'avantage supplémentaire est que la sortie du journal et la sortie du document ne sont pas générées, mais générées et ignorées localement. Bien sûr, la grande différence est d’éviter de télécharger puis de jeter le document index.html.

Volker Siegel
la source
J'aime cette approche aussi. J'apprécie vos commentaires et réponses.
nulltek
3

maintenir en vie le passager Phusion.

Peut-être que votre question devrait être à ce sujet, la page Web dit:

Un serveur Web rapide et robuste et un serveur d'applications pour

Cela ne devrait pas nécessiter de scripts keepalive.

Sinon, la solution de kasperd est parfaite.

utilisateur237113
la source
Merci pour les commentaires, bien que ce ne soit pas très constructif. Les serveurs d'applications échouent - bien que ce ne soit généralement pas la faute du conteneur.
Felix Frank
1
Je conviens qu'il ne devrait pas avoir besoin de cronjobs pour le garder en vie. Mais c’était une solution rapide pendant que je recherchais le réglage Nginx / Passenger. Je cherchais vraiment le meilleur moyen de générer / dev / null. Un passager est tombé en panne ou est resté suspendu pendant 2 minutes à un moment où il n'y a pas de charge, donc demander à l'url de garder le passager enflammé pour le moment.
nulltek
1
Il serait bon de comprendre ce qui est maintenu en vie par les wgetcommandes. Dans de nombreuses situations, la nécessité de garder les messages en vie est le symptôme d'un défaut de conception sous-jacent, qu'il convient de corriger. Mais même si tous ces problèmes sont résolus, il restera quelques cas où un message de maintien en vie est la bonne solution. Même si les messages Keep Alive ne sont pas nécessaires, le travail cron peut néanmoins constituer une partie utile d'une configuration de surveillance.
Kasperd
Ce serait mieux comme commentaire que comme réponse.
Moopet