Leiten der wget-Ausgabe nach / dev / null in cron

38

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

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

Wenn ich dies ausführe, führt es auf der Site eine Wget-URL aus, die STDOUT / STDERR nach / dev / null weiterleitet. Wenn ich dies über eine Befehlszeile ausführe, funktioniert es einwandfrei und es wird keine index.html-Datei in meinem Ausgangsverzeichnis erstellt.

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 möchte.

Ist meine Syntax für die Ausführung des Cron-Jobs falsch? Von einer Kommandozeile aus funktioniert es problemlos, aber von cron aus wird eine index.html-Datei in meinem Home-Verzeichnis erzeugt.

Ich bin sicher, ich mache einen einfachen Fehler. Würde mich freuen, wenn jemand helfen könnte.

nulltek
quelle
1
Eine andere Frage ist, warum hierdurch keine Datei erstellt wird, wenn Sie diese von Hand über die Befehlszeile ausführen. Soweit ich aus der Dokumentation ersehen kann, besteht der einzige Unterschied zwischen der Ausführung wgetvon einem Terminal aus und der Anzeige eines Fortschrittsbalkens.
Barmar

Antworten:

61

Du könntest es so machen:

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

Hier wird -Odie heruntergeladene Datei an /dev/nullund die -oProtokolle an /dev/nullstatt an stderr gesendet. Auf diese Weise ist eine Umleitung überhaupt nicht erforderlich.

Kasperd
quelle
1
Dies ist direkter als die Umleitung zu STDERR / STDOUT. Ich schätze es.
Nulltek
17

Müssen Sie den Inhalt tatsächlich herunterladen oder nur die 200 OK erhalten? Wenn Sie nur den Server die Anfrage verarbeiten lassen müssen, warum nicht einfach das --spiderArgument verwenden?

Nacht - Wiedereinsetzung von Monica
quelle
Das ist ein guter Gedanke. Ich brauche wirklich nur die 200 OK Antwort.
Nulltek
Ich hatte gehofft, jemand, der unvoreingenommen ist, würde darauf hinweisen, aber ... welche Lösung haben Sie letztendlich verwendet? Meine Antwort ist wirklich der richtige Weg, um dies zu tun :)
Nacht - Reinstate Monica
10

Ich würde folgendes verwenden:

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

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

Peter Lamby
quelle
4
Beachten Sie, dass foo > /dev/null 2>&1prägnanter geschrieben als foo &> /dev/null.
Amalloy
3
@amalloy Nur in bash. In sh, was normalerweise von cron verwendet wird, funktioniert die Umleitung von kaufmännischem Und nicht.
Soviero
5

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, die Ausgabe nicht in irgendeiner Weise zu verwerfen, sondern überhaupt keine Ausgabe zu erstellen.

Da Sie nur die Antwort benötigen, müssen die Daten, die in die lokale Datei index.html heruntergeladen werden, nicht an erster Stelle heruntergeladen werden.
Im HTTP-Protokoll wird der Befehl 'GET' zum Herunterladen eines Dokuments verwendet . Um auf ein Dokument so zuzugreifen, dass alles außer dem eigentlichen Herunterladen des Dokuments möglich ist, gibt es einen speziellen Befehl 'HEAD'.
Wenn Sie für diese Aufgabe 'GET' verwenden, wird das Dokument heruntergeladen und lokal verworfen. Mit 'HEAD' können Sie genau das tun, was Sie brauchen. Das Dokument wird nicht an erster Stelle übertragen. Es wird immer derselbe Ergebniscode zurückgegeben wie per Definition 'GET'.

Die Syntax der Methode zu verwenden , HEADmit wgetein wenig seltsam: Wir brauchen die Möglichkeit , zu verwenden --spider. In diesem Zusammenhang macht es einfach, was wir wollen - greifen Sie auf die URL mit 'HEAD' anstelle von 'GET' zu.
Wir können die Option -q(leise) verwenden, um wgetkeine Details darüber auszugeben, was es tut.

Wenn Sie dies kombinieren, wgetwird weder etwas an stderr ausgegeben noch ein Dokument gespeichert.

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

Der Exit-Code gibt an, 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 bedeutet crontabdie Tatsache, dass in beiden Fällen keine Ausgabe erfolgt, dass Sie das Abrufen einer Ausgabe erneut als Hinweis auf Fehler 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 ist, dass die Protokollausgabe und die Dokumentausgabe nicht generiert werden, sondern lokal generiert und verworfen werden. Oder natürlich besteht der große Unterschied darin, das Dokument nicht herunterzuladen und dann zu verwerfen index.html.

Volker Siegel
quelle
Ich mag diesen Ansatz auch. Ich freue mich über Ihr Feedback und Ihre Antwort.
Nulltek
3

Phusion Passenger am Leben zu halten.

Möge Ihre Frage diesbezüglich lauten:

Ein schneller und robuster Webserver und Anwendungsserver für

Dies sollte keine Keepalive-Skripte erfordern.

Ansonsten ist die Lösung von Kasperd perfekt.

user237113
quelle
Vielen Dank für das Feedback, obwohl es nicht sehr konstruktiv ist. Anwendungsserver fallen aus, obwohl es normalerweise nicht die Schuld des Containers ist.
Felix Frank
1
Ich bin damit einverstanden, dass keine Cronjobs erforderlich sind, um es am Leben zu halten. Aber es war eine schnelle Lösung, als ich über das Tuning von Nginx / Passenger recherchierte. War wirklich nur auf der Suche nach dem besten Weg, um nach / dev / null auszugeben. Ich hatte einen Passagierausfall oder habe 2 Minuten lang aufgehängt, wenn keine Ladung vorhanden war. Wenn ich die URL anfordere, bleibt der Passagier vorerst am Laufen.
Nulltek
1
Es wäre gut zu verstehen, was von den wgetBefehlen am Leben erhalten wird . In vielen Situationen ist die Notwendigkeit, Nachrichten am Leben zu erhalten, ein Symptom für einen zugrunde liegenden Konstruktionsfehler, der behoben werden sollte. Aber selbst wenn all diese Probleme behoben sind, bleiben noch einige Fälle übrig, in denen eine Keep-Alive-Nachricht die richtige Lösung ist. Auch wenn keine Keep-Alive-Nachrichten benötigt werden, kann der Cron-Job dennoch ein nützlicher Bestandteil einer Überwachungskonfiguration sein.
Kasperd
Dies wäre als Kommentar besser als eine Antwort.
Moopet