Frage Piping wget Ausgabe nach / dev / null in Cron


Ich führe den folgenden Befehl alle 5 Minuten in meiner Crontab aus, um Phusion Passenger am Leben zu erhalten.

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

Wenn ich das ausführe, führt es ein wget auf der Site-URL aus, wobei STDOUT / STDERR nach / dev / null routet. Wenn ich das über eine Befehlszeile ausführe, funktioniert es einwandfrei und erzeugt keine index.html-Datei in meinem Home-Verzeichnis.

Wenn es von cron aus ausgeführt wird, erstellt es alle fünf Minuten eine neue index.html-Datei, so dass ich eine Menge Indexdateien habe, die ich nicht haben möchte.

Ist meine Syntax zum Ausführen des Cron-Jobs falsch? Von einer Befehlszeile funktioniert es ohne Probleme, aber von Cron erzeugt es eine index.html Datei in meinem Home-Verzeichnis.

Ich bin mir sicher, dass ich einen einfachen Fehler mache, würde es schätzen, wenn jemand helfen könnte.


31
2017-08-11 13:05


Ursprung


Eine andere Frage ist, warum dies keine Datei erstellt, wenn Sie es manuell über die Befehlszeile ausführen. Soweit ich das aus der Dokumentation ersehen kann, ist der einzige Unterschied zwischen dem Laufen wget von einem Terminal und ansonsten ist, ob ein Fortschrittsbalken angezeigt wird. - Barmar


Antworten:


Du könntest es so machen:

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

Hier -O sendet die heruntergeladene Datei an /dev/null und -o meldet sich an /dev/null anstelle von stderr. Auf diese Weise wird eine Umleitung überhaupt nicht benötigt.


54
2017-08-11 13:20



Danke, das ist direkter als das Weiterleiten an STDERR / STDOUT. Ich schätze es. - nulltek


Müssen Sie den Inhalt wirklich downloaden oder erhalten Sie nur das 200 OK? Wenn Sie den Request nur vom Server verarbeiten lassen müssen, verwenden Sie einfach die --spider Streit?


16
2017-08-11 14:03



Das ist ein guter Gedanke. Ich brauche wirklich nur die 200 OK Antwort. - nulltek
Ich hatte gehofft, dass jemand unvoreingenommen darauf hinweisen würde, aber ... welche Lösung hast du am Ende benutzt? Meine Antwort ist wirklich der richtige Weg, dies zu tun :) - Nacht


Ich würde Folgendes verwenden:

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

Das -O - Option stellt sicher, dass der abgerufene Inhalt an stdout gesendet wird.


8
2017-08-11 13:14



Beachten Sie, dass foo > /dev/null 2>&1 ist prägnanter geschrieben als foo &> /dev/null. - amalloy
@amalloy Nur in bash. Im sh, das ist normalerweise, was Cron verwendet, funktioniert das Und-Zeichen-Redirect nicht. - Soviero


Sie sagen, Sie brauchen nur die Antwort "200 OK" in einem Kommentar.

Dies ermöglicht eine Lösung mit einigen zusätzlichen Vorteilen gegenüber denen von
wget -O /dev/null -o /dev/null example.com. Die Idee ist nicht, die Ausgabe in irgendeiner Weise zu verwerfen, sondern überhaupt keine Ausgabe zu erzeugen.

Dass Sie nur die Antwort benötigen, bedeutet, dass die Daten, die in die lokale Datei index.html heruntergeladen werden, nicht erst heruntergeladen werden müssen.
Im HTTP-Protokoll wird der Befehl 'GET' verwendet Laden Sie ein Dokument herunter. Um auf ein Dokument zuzugreifen, das alles tut außer Beim Herunterladen des Dokuments gibt es einen speziellen Befehl "HEAD".
Bei Verwendung von 'GET' für diese Aufgabe wird das Dokument lokal heruntergeladen und verworfen. Wenn Sie "HEAD" verwenden, wird genau das benötigt, was Sie benötigen, das Dokument wird nicht übertragen. Es wird immer den gleichen Ergebniscode zurückgeben wie 'GET' per Definition.

Die Syntax zur Verwendung der Methode HEAD mit wget ist ein wenig seltsam: wir müssen die Option verwenden --spider. In diesem Zusammenhang macht es einfach das, was wir wollen - Zugriff auf die URL mit "HEAD" statt "GET".
Wir können die Option verwenden -q (leise) zu machen wget gib nicht Details darüber aus, was es macht.

Kombiniere das wget wird weder etwas an stderr ausgeben, noch ein Dokument speichern.

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

Der Exit-Code sagt uns, ob die Anfrage erfolgreich war oder nicht:

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

Für einen Befehl in crontabDie Tatsache, dass in beiden Fällen keine Ausgabe erfolgt, bedeutet, dass Sie keine Ausgabe als Fehleranzeige verwenden können.

Ihr Beispielbefehl würde folgendermaßen geändert:

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

Dies hat die gleichen Vorteile wie wget -O /dev/null -o /dev/null example.com. Der zusätzliche Vorteil besteht darin, dass die Protokollausgabe und die Dokumentausgabe nicht generiert, sondern lokal generiert und verworfen werden. Natürlich besteht der große Unterschied darin, das Herunterladen und anschließende Löschen des Dokuments zu vermeiden. index.html.


4
2017-08-17 02:04



Ich mag diesen Ansatz auch. Ich freue mich über Ihr Feedback und Ihre Antwort. - nulltek


Phusion Passenger am Leben erhalten.

Darf Ihre Frage darüber sein, die Webseite sagt:

Ein schneller und robuster Webserver und Anwendungsserver für

Dies sollte keine Keepalive-Skripte erfordern.

Ansonsten ist Kasperds Lösung perfekt.


2
2017-08-11 16:50



Danke für das Feedback, obwohl es nicht sehr konstruktiv ist. Anwendungsserver schlagen fehl, obwohl dies normalerweise nicht der Fehler des Containers ist. - Felix Frank
Ich stimme zu, dass es keine Cronjobs erfordern sollte, um es am Leben zu erhalten. Aber es war eine schnelle Lösung, während ich Nginx / Passenger Tuning recherchiere. War eigentlich nur auf der Suche nach dem besten Weg, um nach / dev / null auszugeben. Ich habe Passagiere haben versagen lassen oder für 2 Minuten zu einer Zeit, wenn es keine Last ist, so die Anfrage der URL hält Passagier jetzt angezündet. - nulltek
Es wäre gut zu verstehen, was es ist, das am Leben erhalten wird wget Befehle. In vielen Situationen ist die Notwendigkeit, Nachrichten am Leben zu erhalten, ein Symptom für einen zugrundeliegenden Konstruktionsfehler, der behoben werden sollte. Aber selbst wenn all diese Dinge behoben sind, wird es immer noch einige Fälle geben, in denen eine Keep Alive-Nachricht die richtige Lösung ist. Selbst wenn Nachrichten, die am Leben bleiben, nicht benötigt werden, könnte der Cron-Job immer noch ein nützlicher Teil eines Überwachungs-Setups sein. - kasperd
Das wäre besser als ein Kommentar als eine Antwort. - moopet