2011-08-04 12 views
17

Czy istnieje sposób, aby powiedzieć curl do błędów wyjściowych do stderr, a wszystko inne do stdout?Dokonywanie curl wysyłanie błędów do stderr i wszystko inne na stdout

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 dziennika, ale pozostawiam stderr bez zmian, aby cron wysłał mi go e-mailem, jeśli jest jakikolwiek plik wyjściowy.)

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 w rzeczywistości 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 normalne wyjście pozostawiono nietknięte na standardowe wyjście?

Odpowiedz

3

Po kilku dodatkowych 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.)

 
# Get a temporary filename 
CURL_LOG=`tempfile` 

(
    # Run curl, and stick all output in the temp file 
    /usr/bin/curl --verbose ... > "$CURL_LOG" 2>&1 
) || (
    # If curl exited with a non-zero error code, send its output to stderr so that 
    # cron will e-mail it. 
    cat "$CURL_LOG" > /dev/stderr 
    rm "$CURL_LOG" 
    exit 1 
) 

# Otherwise curl completed successfully, so send the output to stdout (which 
# is redirected to a log file in crontab) 
cat "$CURL_LOG" 
rm "$CURL_LOG" 
+0

To nie jest krótka i słodka jak inne odpowiedzi, ale to jedyna odpowiedź, która faktycznie wykonuje zadanie. Dziękuję za udostępnienie. – 7yl4r

0

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.

20

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 odpowiedź Russella Davisa na tej stronie man curl i prób i błędów. Dla ciekawskich, tutaj jest wersja wget z pytaniem: https://superuser.com/questions/420120/wget-is-silent-but-it-displays-error-messages

+0

Czy jednak '--silent' nie zezwoli na wysyłanie normalnych komunikatów o postępie do stdout? Nadal chciałbym je zobaczyć, żeby wiedzieć, że curl faktycznie coś robi! – Malvineous

+0

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. –

+0

Nie martw się - może to pomóc komuś innemu, tak jak odpowiedź Russella Davisa dała ci kilka pomysłów :-) – Malvineous

1

curl -s -S

Od strony man:

-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 pokazuje komunikat o błędzie, jeśli się nie powiedzie.

+0

Zobacz komentarze pod @dgo.Odpowiedź a - usuwa również normalne komunikaty o postępach, które mówią, czy wszystko działa zgodnie z oczekiwaniami, które chcę zachować na bieżąco. – Malvineous

Powiązane problemy