2011-08-04 25 views
17

Có cách nào để báo hiệu cho các lỗi đầu ra thành stderr và mọi thứ khác để stdout không?Làm cho curl gửi lỗi cho stderr và mọi thứ khác để stdout

Lý do là tôi đang sử dụng curl từ dòng lệnh (thực ra là cronjob) để tải tệp lên trang FTP mỗi tối. Thật không may vì curl xuất hiện thông tin trạng thái trên stderr, tôi nhận được một e-mail về một lỗi khi không có gì thực sự đi sai. (Tôi đang chuyển hướng stdout sang một tệp nhật ký, nhưng để lại stderr không đổi sao cho cron sẽ gửi nó cho tôi nếu có bất kỳ đầu ra nào.)

Có các tùy chọn để làm curl im lặng, hoặc đầu ra mọi thứ để stdout, tuy nhiên cả hai lựa chọn thay thế này đều ngăn chặn lỗi xuất hiện trên stderr - nghĩa là tôi sẽ không nhận được e-mail khi thực sự có lỗi mà tôi muốn biết.

Vì vậy, có cách nào để chỉ thực hiện các lỗi đầu ra curl trên stderr, nhưng để đầu ra bình thường còn nguyên vẹn trên stdout không?

Trả lời

3

Sau một số thử nghiệm khác, tôi đã đưa ra cách giải quyết sau, nhưng tôi vẫn mở cho các lựa chọn thay thế tốt hơn.

Nó hoạt động bằng cách tạm thời lưu trữ tất cả đầu ra (stdout và stderr) trong một tệp tạm thời và sau đó gửi nội dung của tệp đó tới stderr hoặc stdout tùy thuộc vào mã thoát của curl. Nếu curl thất bại toàn bộ đầu ra sẽ đi đến stderr (và được gửi qua thư cho tôi nhờ cron), nhưng nếu curl thành công thì đầu ra sẽ chuyển sang stdout thay vào đó (được chuyển hướng đến một tệp nhật ký trong lệnh cron, dẫn đến không 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

Nó không ngắn và ngọt như các câu trả lời khác, nhưng đó là câu trả lời duy nhất thực sự thực hiện công việc. Cám ơn vì đã chia sẻ. – 7yl4r

0

curl -f. Tài liệu nói "Không âm thầm (không có đầu ra nào cả) trên các lỗi máy chủ" nhưng nó thực sự có nghĩa là "không có đầu ra để stdout" - lỗi vẫn sẽ được đầu ra để stderr.

20

Hãy thử điều này:

# 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 

Nhờ câu trả lời Russell Davis trên trang này, man curl, và thử và sai. Đối với người hiếu, đây là phiên bản wget của câu hỏi: https://superuser.com/questions/420120/wget-is-silent-but-it-displays-error-messages

+0

Sẽ không '--silent' ngăn thông điệp tiến trình bình thường được gửi đến stdout mặc dù? Tôi vẫn muốn thấy những điều này để tôi biết curl thực sự đang làm điều gì đó! – Malvineous

+0

Ngoài ra còn có một vấn đề khác với câu trả lời của tôi: Tôi chưa bao giờ sử dụng curl để tải lên FTP. Đây là một sự lãng phí thời gian của bạn. Tôi xin lỗi vì đã xem xét các khía cạnh quan trọng của câu hỏi của bạn. Tôi sẽ xóa câu trả lời này để tránh nhầm lẫn hơn nữa. –

+0

Đừng lo lắng về nó - nó có thể giúp đỡ người khác giống như câu trả lời của Russell Davis cho bạn một số ý tưởng :-) – Malvineous

1

curl -s -S

Từ trang người đàn ông:

-s Chế độ im lặng hoặc yên tĩnh. Không hiển thị đồng hồ tiến độ hoặc thông báo lỗi. Làm cho Curl tắt tiếng.

-S Khi được sử dụng với -s nó làm cho curl hiển thị thông báo lỗi nếu không thành công.

+0

Hãy xem các bình luận dưới @dgo.Câu trả lời của một - điều này cũng loại bỏ các thông điệp tiến độ bình thường cho bạn biết liệu mọi thứ có hoạt động như mong đợi hay không, cái mà tôi muốn tiếp tục xuất hiện. – Malvineous

Các vấn đề liên quan