Curl có thời gian chờ không?


251

Cho đến nay tôi không thể tìm thấy bất cứ điều gì thực sự, nhưng sự thật là curlkhông thực sự hết thời gian?

 user@host:~# curl http://localhost/testdir/image.jpg

Tôi đang hỏi bởi vì tôi đang chuyển hướng bất kỳ yêu cầu nào về hình ảnh testdirsang một mô-đun Apache riêng biệt để tạo ra những hình ảnh đó một cách nhanh chóng. Có thể mất tới 15 phút trước khi bức ảnh thực sự sẵn sàng và được gửi đến khách hàng yêu cầu.

Sẽ curlluôn chờ đợi (hoặc tùy thuộc vào cấu hình) hoặc có bất kỳ loại thời gian chờ nào không?


3
Tôi hy vọng curl sẽ có thời gian chờ kết nối (nếu không có gì khác, hệ điều hành và ngăn xếp TCP / IP của nó gần như chắc chắn), nhưng nó có thể không có thời gian chờ đọc sau khi kết nối được thiết lập.
một CVn

Câu trả lời:


340

Đúng.

Thông số hết thời gian chờ

curlcó hai lựa chọn: --connect-timeout--max-time.

Trích dẫn từ trang chủ:

--connect-timeout <seconds>
    Maximum  time  in  seconds  that you allow the connection to the
    server to take.  This only limits  the  connection  phase,  once
    curl has connected this option is of no more use.  Since 7.32.0,
    this option accepts decimal values, but the actual timeout  will
    decrease in accuracy as the specified timeout increases in deci‐
    mal precision. See also the -m, --max-time option.

    If this option is used several times, the last one will be used.

và:

-m, --max-time <seconds>
    Maximum  time  in  seconds that you allow the whole operation to
    take.  This is useful for preventing your batch jobs from  hang‐
    ing  for  hours due to slow networks or links going down.  Since
    7.32.0, this option accepts decimal values, but the actual time‐
    out will decrease in accuracy as the specified timeout increases
    in decimal precision.  See also the --connect-timeout option.

    If this option is used several times, the last one will be used.

Mặc định

Tại đây (trên Debian), nó dừng cố gắng kết nối sau 2 phút, bất kể thời gian được chỉ định bằng --connect-timeoutvà mặc dù giá trị thời gian chờ kết nối mặc định dường như là 5 phút theo DEFAULT_CONNECT_TIMEOUTmacro trong lib / connect.h .

Một giá trị mặc định --max-timedường như không tồn tại, khiến cho việc curlchờ phản hồi mãi mãi nếu kết nối ban đầu thành công.

Dùng gì?

Bạn có thể quan tâm đến các tùy chọn sau , --max-time. Đối với trường hợp của bạn, đặt nó thành 900(15 phút).

Chỉ định tùy chọn --connect-timeoutcho một cái gì đó như 60(một phút) cũng có thể là một ý tưởng tốt. Nếu không curlsẽ cố gắng kết nối nhiều lần, rõ ràng là sử dụng một số thuật toán backoff.


2
cảm ơn vì điều đó! --max-time không nói gì về các giá trị mặc định, vì vậy tôi đoán nó không có và do đó không có thời gian chờ ngoại trừ thời gian chờ kết nối theo mặc định ...?
Preexo

4
Có, nếu kết nối thành công thì curl dường như chờ đợi phản hồi mãi mãi.
scai

Lưu ý rằng cả hai thời gian tối đa là một vấn đề nếu phản hồi là một tải xuống lớn mất nhiều thời gian hơn 'thời gian tối đa'.
dùng92979

1
Thời gian chờ 2 phút cũng có mùi với tôi như thời gian chờ máy chủ. Cũng gặp vấn đề tương tự với máy chủ http của ứng dụng Node.js có thời gian chờ mặc định là 2 phút. Để tăng nó, hãy xem HTTP.server.setTimeout () .
Thalis K.

17

Có thời gian: / usr / bin / tim006it - giới hạn hiệu quả thời gian thực hiện tuyệt đối của một quy trình

 Options:

 -p      If the child process is terminated by a signal, timelimit
         propagates this condition, i.e. sends the same signal to itself. 
         This allows the program executing timelimit to determine 
         whether the child process was terminated by a signal or 
         actually exited with an exit code larger than 128.
 -q      Quiet operation - timelimit does not output diagnostic 
         messages about signals sent to the child process.
 -S killsig
         Specify the number of the signal to be sent to the 
         process killtime seconds after warntime has expired.  
         Defaults to 9 (SIGKILL).
 -s warnsig
         Specify the number of the signal to be sent to the 
         process warntime seconds after it has been started.  
         Defaults to 15 (SIGTERM).
 -T killtime
         Specify the maximum execution time of the process before 
         sending killsig after warnsig has been sent.  Defaults to 120 seconds.
 -t warntime
         Specify the maximum execution time of the process in 
         seconds before sending warnsig.  Defaults to 3600 seconds.

 On systems that support the setitimer(2) system call, the 
 warntime and killtime values may be specified in fractional 
 seconds with microsecond precision.

1
Không có sẵn theo mặc định trên macOS 10.13.4.
Thorbjørn Ravn Andersen

14

Tốt hơn --max-time--speed-limit--speed-timecác tùy chọn. Nói tóm lại, --speed-limitchỉ định tốc độ trung bình tối thiểu mà bạn sẵn sàng chấp nhận và --speed-timechỉ định thời gian tốc độ truyền có thể duy trì dưới giới hạn đó trước khi hết thời gian chuyển và bị hủy bỏ.


9
Tôi nghĩ không phải là tốt hơn, nhưng trong trường hợp sử dụng của tôi - thời gian thực sự phù hợp hơn bởi vì bất cứ điều gì dài hơn 10 giây sẽ khiến chương trình của tôi trở nên vô dụng.
Jorge Bucaran

Tôi đang sử dụng curl như một thư viện trong một ứng dụng máy tính để bàn (không chỉ gọi nó từ CLI) và với tôi tùy chọn của bạn là phù hợp nhất. Ứng dụng của tôi phải có khả năng hỗ trợ tải xuống lâu, vì vậy thời gian --max đơn giản không phù hợp để phát hiện "tải xuống bị kẹt" (ví dụ, nếu người dùng ngoại tuyến trong khi tải xuống ở trong tiến trình), vì vậy tôi đã đi với giới hạn tốc độ 1024 và thời gian tốc độ là 30 để phát hiện những điều này.
André Morujão

1
Hữu ích? Chắc chắn rồi. Tốt hơn? Tôi nghĩ điều đó phụ thuộc rất nhiều vào yêu cầu của bạn
Brian Agnew

Thời gian chờ là một vấn đề nếu phản hồi có thể là một tải xuống lớn với kích thước không xác định (hoặc thậm chí đã biết!). thời gian tối đa sẽ hết thời gian nếu quá trình tải xuống lớn mất hơn 15 phút. Và các giới hạn tốc độ có thể bị vấp bởi các proxy lưu trữ toàn bộ phản hồi trước khi chuyển tiếp mọi thứ. Đôi khi chúng dường như chuyển tiếp 1 byte mỗi phút, nhưng làm thế nào để biết đó là proxy lưu trữ trên mạng nhanh hay kết nối rất chậm nên được thử lại ?? Vì vậy, cuối cùng tôi đã từ bỏ và tắt thời gian chờ cho các truy vấn tải xuống. Không chắc chắn nếu có một cách tốt hơn.
dùng92979

3

Nếu bạn đã cài đặt coreutils trên MacOS, bạn có thể sử dụng lệnh GNU timeout đi kèm với gói đó. Tất cả các công cụ GNU đều có tiền tố với gCLI gtimeout.

gtimeout --help
Usage: gtimeout [OPTION] DURATION COMMAND [ARG]...
 or:  gtimeout [OPTION]
Start COMMAND, and kill it if still running after DURATION.

Thí dụ

$ gtimeout 1s curl -I http://www.google.com/
HTTP/1.1 200 OK
Date: Wed, 31 Oct 2018 03:36:08 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
Server: gws
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Set-Cookie: 1P_JAR=2018-10-31-03; expires=Fri, 30-Nov-2018 03:36:08 GMT; path=/; domain=.google.com
HttpOnly
Transfer-Encoding: chunked
Accept-Ranges: none
Vary: Accept-Encoding

0

Vài giải pháp trong BASH4 +

# -- server available to check via port xxx ?  --
function isServerAvailableNC() {
    max_secs_run="${3}"
    if timeout $max_secs_run nc -z ${1} ${2} 2>/dev/null >/dev/null; then
        #echo "${1} ✓"
        true
   else
        #echo "${1} ✗"
        return
   fi
}


# -- server available to check via port xxx ?  --
# -- supported protocols (HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, DICT, TELNET, LDAP or FILE) --
#/usr/bin/curl -sSf --max-time 3 https://ifwewanted.to.confirm.https.com/ --insecure

function isServerAvailableCURL() {

    max_secs_run="${3}"

    proto="http://"
    if [ ! -z ${2} ] || [ ${2} -gt 80 ] ;then
        proto="https://"
    fi

    if /usr/bin/curl -sSf --max-time "${max_secs_run}" "${1}" --insecure 2>/dev/null >/dev/null; then
        #echo "${1} ✓"
        true
    else
        #echo "${1} ✗"
        false
    fi
}

Sử dụng mẫu:

KHUYẾN NGHỊ R NCNG NC được sử dụng nếu chúng ta cần một cổng cụ thể

host="1.2.3.4"
if isServerAvailableCURL "$host" "80" "3";then
    check_remote_domain_cert "$host"
fi


host="1.2.3.4"
if isServerAvailableNC "$host" "80" "3";then
    check_remote_domain_cert "$host"
fi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.