Pytanie Tworzenie curl wysyła błędy na stderr i wszystko inne na standardowe wyjście


Czy istnieje sposób na powiedzenie curl, aby wyświetlał błędy na stderr, a wszystko inne na standardowe wyjście?

Powodem jest to, że używam curl z wiersza poleceń (właściwie cronjob), aby co wieczór przesyłać pliki do witryny FTP. Niestety, ponieważ curl wyświetla informacje o statusie na stderr, otrzymuję wiadomość e-mail o błędzie, gdy nic nie poszło nie tak. (Przekierowuję standardowe wyjście do pliku logu, ale pozostawiam stderr bez zmian, aby cron wysłał mi go e-mailem, jeśli są jakieś dane wyjściowe).

Istnieją opcje, które powodują, że curl jest cichy, lub wyprowadza wszystko na standardowe wyjście, jednak obie te alternatywy zapobiegają pojawianiu się błędów na stderr - co oznacza, że ​​nie otrzymam wiadomości e-mail, gdy faktycznie wystąpił błąd, o którym chcę wiedzieć.

Czy istnieje sposób na sprawienie, by na wyjściu stderr pojawiały się tylko błędy wyjściowe, ale pozostaw normalny wynik na stdout?


21
2017-08-04 00:49


pochodzenie




Odpowiedzi:


Spróbuj tego:

# No error messages because it succeeds.
curl  http://www.shikadi.net/        --fail --silent --show-error

# This prints an error message to stderr
curl  http://i.like.you.def.maybe/   --fail --silent --show-error

Dzięki odpowiedzi Russella Davisa na tej stronie, man curloraz prób i błędów. Dla ciekawskich, tutaj jest wget wersja pytania: https://superuser.com/questions/420120/wget-is-silent-but-it-displays-error-messages


24
2017-08-17 03:11



Przyzwyczajenie --silent uniemożliwić wysyłanie normalnych komunikatów o postępie na standardowe wyjście? Nadal chciałbym je zobaczyć, żeby wiedzieć, że curl faktycznie coś robi! - Malvineous
Jest też inny problem z moją odpowiedzią: nigdy nie użyłem curl do przesyłania FTP. To była strata twojego czasu. Przepraszam za pominięcie ważnych aspektów Twojego pytania. Skasuję tę odpowiedź, aby uniknąć dalszego zamieszania. - dgo.a
Nie martw się - może to pomóc komuś innemu, tak jak odpowiedź Russella Davisa dała ci kilka pomysłów :-) - Malvineous


Po dalszych eksperymentach wymyśliłem następujące obejście, ale wciąż jestem otwarty na lepsze alternatywy.

Działa poprzez tymczasowe przechowywanie wszystkich danych wyjściowych (stdout i stderr) w pliku tymczasowym, a następnie wysyłanie zawartości tego pliku na stderr lub stdout w zależności od kodu wyjściowego curl. Jeśli zawijanie się nie powiedzie, całe wyjście przejdzie na stderr (i otrzyma e-mailem do mnie dzięki cron), ale jeśli zwinięcie się powiedzie, wyjście przejdzie do stdout zamiast tego (które jest przekierowywane do pliku dziennika w poleceniu cron, powodując brak e-mail.)

# Uzyskaj tymczasową nazwę pliku
CURL_LOG = `tempfile`

(
  # Uruchom curl i przyklej wszystkie dane wyjściowe do pliku tymczasowego
  / usr / bin / curl --verbose ...> "$ CURL_LOG" 2> i 1
) || (
  # Jeśli curl wyjdzie z niezerowym kodem błędu, wyślij jego wyjście do stderr, aby
  # cron wyśle ​​to e-mailem.
  cat "$ CURL_LOG"> / dev / stderr
  rm "$ CURL_LOG"
  wyjdź 1
)

# W przeciwnym razie zakończono pomyślnie zwijanie, więc wyślij dane wyjściowe do stdout (które
# jest przekierowywane do pliku logu w crontab)
cat "$ CURL_LOG"
rm "$ CURL_LOG"

3
2017-08-04 01:59



To nie jest krótkie i słodkie, jak inne odpowiedzi, ale to jedyna odpowiedź, która naprawdę wykonuje swoją robotę. Dziękuję za udostępnienie. - 7yl4r


curl -s -S

Ze strony podręcznika:

-s Tryb cichy lub cichy. Nie pokazuj miernika postępu ani komunikatów o błędach. Sprawia, że ​​Curl wyciszenia.

-S W połączeniu z -s sprawia, że ​​curl wyświetla komunikat o błędzie, jeśli się nie powiedzie.


1
2017-12-21 14:04



Rzuć okiem na komentarze w odpowiedzi @ dgo.a - to również usuwa normalne komunikaty o postępach, które mówią, czy wszystko działa zgodnie z oczekiwaniami, które chcę zachować na bieżąco. - Malvineous


curl -f. Dokumentacja mówi "Zepsuj cicho (brak wyjścia w ogóle) na błędach serwera", ale to naprawdę oznacza "brak wyjścia na standardowe wyjście" - błędy będą nadal wysyłane na stderr.


0
2018-01-16 22:34