Przesyłanie danych wyjściowych wget do / dev / null w cron

38

Uruchamiam następujące polecenie co 5 minut na moim crontabie, aby utrzymać Phusion Passenger przy życiu.

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

Kiedy go uruchomię, wykonuje on wget na adresie URL trasy STDOUT / STDERR do / dev / null. Kiedy uruchamiam to z wiersza poleceń, działa dobrze i nie tworzy pliku index.html w moim katalogu domowym.

Kiedy uruchamia się z crona, tworzy nowy plik index.html co pięć minut, pozostawiając mi mnóstwo plików indeksu, których nie chcę.

Czy moja składnia jest niepoprawna do uruchomienia zadania cron? Z wiersza poleceń działa bez problemu, ale z crona generuje plik index.html w moim katalogu domowym.

Jestem pewien, że popełniam prosty błąd, doceniłbym go, gdyby ktoś mógł pomóc.

nulltek
źródło
1
Kolejne pytanie dotyczy tego, dlaczego nie tworzy się pliku po uruchomieniu go ręcznie z wiersza poleceń. O ile mogę stwierdzić na podstawie dokumentacji, jedyną różnicą między uruchamianiem wgetz terminala a innymi kwestiami jest to, czy wyświetlany jest pasek postępu.
Barmar

Odpowiedzi:

61

Możesz to zrobić w następujący sposób:

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

Tutaj -Owysyła pobrany plik /dev/nulli -ologuje się do /dev/nullzamiast stderr. W ten sposób przekierowanie nie jest wcale potrzebne.

kasperd
źródło
1
Dzięki, jest to bardziej bezpośrednie niż przekierowanie do STDERR / STDOUT. Doceniam to.
nulltek
17

Czy musisz pobrać zawartość, czy po prostu otrzymać 200 OK? Jeśli musisz tylko poprosić serwer o przetworzenie żądania, dlaczego po prostu nie użyjesz --spiderargumentu?

Nacht - Przywróć Monikę
źródło
To dobra myśl. Naprawdę potrzebuję tylko odpowiedzi 200 OK.
nulltek
Miałem nadzieję, że ktoś bezstronny zwróci na to uwagę, ale ... jakiego rozwiązania użyłeś? Moja odpowiedź jest naprawdę prawidłowym sposobem, aby to zrobić :)
Nacht - Przywróć Monikę
10

Użyłbym następujących:

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

Ta -O -opcja zapewnia, że ​​pobrana zawartość jest wysyłana na standardowe wyjście.

Peter Lamby
źródło
4
Zauważ, że foo > /dev/null 2>&1jest bardziej zwięźle napisane jako foo &> /dev/null.
amalloy
3
@amalloy Tylko w bash. W sh, co zwykle używa cron, ampersand przekierowanie nie działa.
Soviero
5

Mówisz, że potrzebujesz tylko odpowiedzi „200 OK” w komentarzu.

Pozwala to na rozwiązanie z pewnymi dodatkowymi zaletami w stosunku do
wget -O /dev/null -o /dev/null example.com. Chodzi o to, aby nie odrzucać wyników w jakikolwiek sposób, ale nie tworzyć żadnych wyników.

To, że potrzebujesz tylko odpowiedzi, oznacza, że ​​dane pobrane do lokalnego pliku index.html nie muszą być pobierane w pierwszej kolejności.
W protokole HTTP do pobrania dokumentu służy polecenie „GET” . Aby uzyskać dostęp do dokumentu w sposób, który robi wszystko oprócz faktycznego pobrania dokumentu, istnieje specjalne polecenie „HEAD”.
Podczas korzystania z polecenia „GET” do tego zadania dokument jest pobierany i odrzucany lokalnie. Używanie „HEAD” robi dokładnie to, czego potrzebujesz, nie przenosi dokumentu w pierwszej kolejności. Zawsze zwróci ten sam kod wyniku, co z definicji „GET”.

Składnia użyć metody HEADze wgetto trochę dziwne: musimy użyć opcji --spider. W tym kontekście robi to, co chcemy - uzyskuje się dostęp do adresu URL za pomocą „HEAD” zamiast „GET”.
Możemy użyć opcji -q(ciche), aby wgetnie wyświetlać szczegółowych informacji o tym, co robi.

Łącząc to, wgetnie wyprowadzi niczego do stderr ani nie zapisze dokumentu.

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

Kod wyjścia informuje nas, czy żądanie powiodło się, czy nie:

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

W przypadku polecenia in crontabfakt, że w obu przypadkach nie ma danych wyjściowych, oznacza, że ​​możesz ponownie użyć braku danych jako wskaźnika błędów.

Twoje przykładowe polecenie zostanie zmienione na:

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

Ma to takie same zalety jak wget -O /dev/null -o /dev/null example.com. Dodatkową zaletą jest to, że dane wyjściowe dziennika i dokumentu nie są generowane, zamiast generowane i odrzucane lokalnie. Lub oczywiście wielka różnica jest unikanie pobrać, a następnie odrzucić dokument index.html.

Volker Siegel
źródło
Lubię to podejście. Doceniam twoją opinię i odpowiedź.
nulltek
3

aby utrzymać przy życiu Pasażera Phusion.

Niech twoje pytanie powinno dotyczyć tego, strona mówi:

Szybki i niezawodny serwer WWW i serwer aplikacji dla

Nie powinno to wymagać żadnych skryptów podtrzymujących działanie.

W przeciwnym razie rozwiązanie kasperda jest idealne.

użytkownik237113
źródło
Dzięki za opinie, choć nie jest to zbyt konstruktywne. Serwery aplikacji zawodzą - chociaż zwykle nie jest to wina kontenera.
Felix Frank,
1
Zgadzam się, że nie powinno wymagać żadnych cronjobs, aby utrzymać go przy życiu. Ale to było szybkie rozwiązanie, gdy badam tuning Nginx / Passenger. Naprawdę szukałem najlepszego sposobu na wyjście do / dev / null. Miałem błąd pasażera lub zawiesiłem się na 2 minuty w czasie, gdy nie ma ładunku, więc żądanie adresu URL powoduje, że pasażer jest na razie zwolniony.
nulltek
1
Dobrze byłoby zrozumieć, co wgetprzykazania utrzymują przy życiu . W wielu sytuacjach potrzeba utrzymywania żywych komunikatów jest objawem podstawowej wady projektowej, którą należy naprawić. Ale nawet jeśli wszystkie zostaną naprawione, nadal pozostanie kilka przypadków, w których komunikat utrzymania przy życiu jest właściwym rozwiązaniem. Nawet jeśli komunikaty podtrzymywania aktywności nie są potrzebne, zadanie cron może nadal być użyteczną częścią konfiguracji monitorowania.
kasperd
Byłoby to lepsze jako komentarz niż odpowiedź.
moopet