Mam wrażenie, że brakuje mi tego, co oczywiste, ale nie udało mi się man [curl|wget]
ani google („http” sprawia, że wyszukiwane hasło jest złe). Szukam szybkiego i brudnego rozwiązania dla jednego z naszych serwerów, który często się nie udaje, zwracając kod stanu 500 z komunikatem o błędzie. Gdy to się stanie, należy go ponownie uruchomić.
Ponieważ podstawowa przyczyna wydaje się być trudna do znalezienia, dążymy do szybkiej naprawy, mając nadzieję, że wystarczy czasu, aby naprawdę ją naprawić (usługa nie wymaga wysokiej dostępności)
Proponowanym rozwiązaniem jest utworzenie zadania cron, które będzie uruchamiane co 5 minut, sprawdzając http: // localhost: 8080 / . Jeśli to zwróci kod stanu 500, serwer WWW zostanie zrestartowany. Serwer uruchomi się ponownie za niecałą minutę, więc nie ma potrzeby sprawdzania, czy restart już działa.
Serwer, o którym mowa, to minimalna instalacja Ubuntu 8.04 z zainstalowanymi wystarczającymi pakietami, aby uruchomić to, czego aktualnie potrzebuje. Nie ma twardego wymagania, aby wykonać zadanie w bash, ale chciałbym, aby działało w tak minimalnym środowisku bez instalowania żadnych interpreterów.
(Jestem wystarczająco zaznajomiony ze skryptami, że wystarczy polecenie / opcje przypisania kodu stanu HTTP do zmiennej środowiskowej - tego szukałem i nie mogłem znaleźć).
źródło
response=$(curl --write-out \\n%{http_code} --silent --output - servername)
- ostatnim wierszem w wyniku będzie kod odpowiedzi.--insecure
.Pracuje. Jeśli nie, musisz nacisnąć Return, aby wyświetlić sam kod.
źródło
Musiałem dziś szybko coś pokazać i wymyśliłem to. Pomyślałem, że umieściłbym to tutaj, gdyby ktoś potrzebował czegoś podobnego do wniosku OP.
Spowoduje to wysłanie powiadomienia e-mail o każdej zmianie stanu z 200, więc jest głupi i potencjalnie chciwy. Aby to poprawić, przyjrzałbym się zapętlaniu kilku kodów statusu i wykonywaniu różnych akcji zależnych od wyniku.
źródło
Chociaż zaakceptowana odpowiedź jest dobrą odpowiedzią, nie uwzględnia scenariuszy awarii.
curl
zwróci,000
jeśli wystąpi błąd w żądaniu lub wystąpi błąd połączenia.Uwaga: wykracza to nieco poza wymaganą
500
kontrolę stanu, aby potwierdzić, żecurl
można nawet połączyć się z serwerem (tzn. Zwraca000
).Utwórz z niego funkcję:
Przetestuj uzyskanie
500
:Sprawdź, czy wystąpił błąd / awaria połączenia (tj.
000
):Test nie otrzymuje
500
:źródło
Za pomocą netcat i awk możesz ręcznie obsłużyć odpowiedź serwera:
źródło
Aby śledzić przekierowania 3XX i drukować kody odpowiedzi dla wszystkich żądań:
źródło
grep
Przechwyci wszystkie linie z „http” w nich. Być może,grep -m 1 HTTP
aby złapać tylko pierwsze dopasowanie, jeśli taka jest intencja, lub może zamiast tego przesłać potokiem do Awk, aby przeanalizować tylko kod wyniku.może to pomóc w ocenie stanu HTTP
źródło
head -n 1 | awk '{stuff}'
jest trochę antypatternem,awk 'NR==1 {stuff}'
robi to samo w jednym procesie, czysty Awk.Kolejna odmiana:
źródło
Nadchodzi od dawna - ale łatwy do zrozumienia - skrypt, zainspirowany rozwiązaniem nicerobot , który żąda tylko nagłówków odpowiedzi i unika używania IFS zgodnie z sugestią tutaj . Wysyła komunikat odbicia, gdy napotka odpowiedź> = 400. To echo można zastąpić skryptem odbicia.
źródło
Nie podobały mi się tutaj odpowiedzi łączące dane ze statusem. znaleziono to: dodajesz flagę -f, aby curl się nie powiódł i odbierasz kod statusu błędu ze standardowego statusu var: $?
/unix/204762/return-code-for-curl-used-in-a-command-substitution
nie wiem, czy jest idealny do każdego scenariusza tutaj, ale wydaje się, że pasuje do moich potrzeb i myślę, że o wiele łatwiej jest z nim pracować
źródło
Oto moja implementacja, która jest nieco bardziej szczegółowa niż niektóre poprzednie odpowiedzi
źródło
Aby dodać do komentarza @DennisWilliamson powyżej:
Następnie możesz przeanalizować kod odpowiedzi z odpowiedzi, używając czegoś takiego, jak poniżej, gdzie X może oznaczać regex w celu oznaczenia końca odpowiedzi (używając tutaj przykładu json)
Zobacz Usuwanie podciągów: http://tldp.org/LDP/abs/html/string-manipulation.html
źródło
echo
do uzyskania ostatecznej wartości? Po prostucode=${response##*\}}
jest prostszy i pozwala uniknąć wielu typowych pułapek. Jest to również wzorzec globalny, a nie właściwe wyrażenie regularne.