web-dev-qa-db-fra.com

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

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

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

Lorsque j'exécute cela, il exécute un wget sur les routes d'URL du site STDOUT/STDERR vers/dev/null. Lorsque je l'exécute à partir d'une ligne de commande, cela fonctionne bien et ne produit pas de fichier index.html dans mon répertoire personnel.

Lorsqu'il s'exécute à partir de cron, il crée un nouveau fichier index.html toutes les cinq minutes, me laissant avec une tonne de fichiers d'index dont je ne veux pas.

Ma syntaxe est-elle incorrecte pour exécuter le travail cron? À 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 vous serais reconnaissant de bien vouloir aider quelqu'un.

41
nulltek

Vous pouvez le faire comme ceci:

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

Ici -O envoie le fichier téléchargé à /dev/null et -o se connecte à /dev/null au lieu de stderr. De cette façon, la redirection n'est pas nécessaire du tout.

65
kasperd

Avez-vous besoin de télécharger le contenu ou simplement de recevoir le 200 OK? Si le serveur doit uniquement traiter la demande, pourquoi ne pas simplement utiliser le --spider argument?

17

J'utiliserais ce qui suit:

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

L'option -O - Garantit que le contenu récupéré est envoyé à stdout.

10
Peter Lamby

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

Cela permet une solution avec quelques 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 manière ou d'une autre, 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 d'une manière qui fait tout sauf télécharger réellement le document, il y a une commande spéciale 'HEAD'.
Lorsque vous utilisez 'GET' pour cette tâche, le document est téléchargé et jeté localement. L'utilisation de 'HEAD' fait exactement ce dont vous avez besoin, elle ne transfère pas le document en premier lieu. Il retournera toujours le même code de résultat que 'GET' le ferait, par définition.

La syntaxe pour utiliser la méthode HEAD avec wget est un peu étrange: nous devons utiliser l'option --spider. Dans ce contexte, il fait juste ce que nous voulons - accéder à l'URL avec 'HEAD' au lieu de 'GET'.
Nous pouvons utiliser l'option -q (silencieux) pour que wget ne produise pas de détails sur ce qu'il fait.

En combinant cela, wget ne sortira rien vers stderr, ni n'enregistrera un document.

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

Le code de sortie nous indique si la demande a réussi 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 l'obtention d'aucune sortie comme indication d'erreurs.

Votre exemple de commande serait modifié comme suit:

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

Cela présente 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, au lieu d'être générées et supprimées localement. Ou bien sûr, la grande différence consiste à éviter de télécharger puis de jeter le document, index.html.

5
Volker Siegel

pour garder Phusion Passenger en vie.

Que votre question soit à ce sujet, la page Web dit:

Un serveur Web et un serveur d'applications rapides et robustes pour

Cela ne devrait pas nécessiter de scripts keepalive.

Sinon, la solution de kasperd est parfaite.

3
user237113