Чи має завиток тайм-аут?


251

Поки що я нічого не міг знайти насправді, але це правда, що curlнасправді взагалі не вичерпується?

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

Я запитую, тому що я переадресовую будь-який запит на зображення в testdirокремий модуль Apache, який генерує ці зображення на льоту. Перш ніж зображення буде готове та доставлене клієнту, що запитує, може пройти до 15 хвилин.

curlЗавжди буде чекати (чи це залежить від конфігурації) чи є якийсь час очікування?


3
Я б очікував, що у curl буде встановлений час очікування на з'єднання (якщо нічого іншого, ОС і його стек TCP / IP майже напевно це роблять), але після встановлення з'єднання він може не мати часу очікування зчитування.
CVn

Відповіді:


340

Так.

Параметри таймауту

curlмає два варіанти: --connect-timeoutі --max-time.

Цитування з сторінки сторінки:

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

і:

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

За замовчуванням

Тут (на Debian) він припиняє намагатися підключитися через 2 хвилини, незалежно від часу, вказаного з, --connect-timeoutі хоча значення тайм-ауту підключення за замовчуванням здається 5 хвилин відповідно до DEFAULT_CONNECT_TIMEOUTмакросу lib / connect.h .

Значення за замовчуванням для --max-time, здається, не існує, тому curlзмушуйте вічно чекати відповіді, якщо початкове підключення вдалося.

Що використовувати?

Ви, ймовірно , зацікавлені в останньому варіанті, --max-time. Для вашого випадку встановіть його на 900(15 хвилин).

Вказати варіант --connect-timeoutна щось на кшталт 60(одну хвилину) також може бути хорошою ідеєю. Інакше curlспробуємо підключитися знову і знову, мабуть, використовуючи якийсь алгоритм повернення даних.


2
Дякую за це! --max-time нічого не говорить про значення за замовчуванням, тому я гадаю, що у нього немає і, отже, немає тайм-ауту, за винятком режиму підключення за замовчуванням ...?
Пріксо

4
Так, якщо з'єднання вдалося, згортання, здається, вічно чекає відповіді.
scai

Зауважте, що обидва maxtime є проблемою, якщо відповідь є великим завантаженням, яке займає більше часу, ніж "maxtime".
користувач92979

1
2-хвилинний тайм-аут також пахне мною, як тайм-аут сервера. Тільки-то були проблеми з http-сервером програми Node.js, яка за замовчуванням складає 2 хвилини. Щоб збільшити його, див. HTTP.server.setTimeout () .
Таліс К.

17

Існує timelimit: / usr / bin / timelimit - ефективно обмежувати абсолютний час виконання процесу

 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
Не доступно за замовчуванням у macOS 10.13.4 принаймні.
Thorbjørn Ravn Andersen

14

Краще, ніж --max-timeє --speed-limitі --speed-timeваріанти. Коротше кажучи, --speed-limitвказує мінімальну середню швидкість, яку ви готові прийняти, і --speed-timeвизначає, як довго може залишатися швидкість передачі нижче цієї межі, перш ніж вичерпано та припинено перенесення.


9
Я думаю, що це не краще, але в моєму випадку використання - maxx-час насправді є більш підходящим, оскільки все, що перевищує 10 секунд, мою програму не дасть.
Хорхе Букаран

Я використовую curl як бібліотеку в настільному додатку (а не просто викликаю його з CLI), і мені найкраще підійшов ваш варіант. У моїй програмі повинно бути підтримка тривалих завантажень, тому простий --max-час не дуже підходить для виявлення "застряглих завантажень" (що стосується випадків, якщо, наприклад, користувач перебуває в автономному режимі під час завантаження прогрес), тому я пішов з обмеженням швидкості 1024 та швидкістю 30, щоб виявити їх.
Андре Моруджао

1
Корисно? Звичайно. Краще? Я думаю, що це дуже залежить від ваших вимог
Брайан Агнев

Часи очікування є проблемою, якщо відповідь може бути великим завантаженням невідомого (або навіть відомого!) Розміру. maxtime закінчиться, якщо велике завантаження займе, наприклад, більше 15 хвилин. А обмеження швидкості може бути встановлено проксі-серверами, які спочатку кешують всю відповідь, перш ніж щось переслати. Іноді вони, здається, пересилають 1 байт на хвилину, але як ви можете сказати, чи це кеш-проксі у швидкій мережі чи дуже повільне з'єднання, яке слід повторити ?? Тож врешті-решт я відмовився і вимкнув тайм-аути для запитів на завантаження. Не впевнений, чи є кращий спосіб.
користувач92979

3

Якщо у вас встановлено coreutils на MacOS, ви можете скористатися командою тайм-ауту GNU, яка входить до цього пакету. В усіх інструментах GNU встановлено префікс gтак, щоб це було CLI gtimeout.

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

Приклад

$ 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

Пара рішень в 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
}

Використання зразка:

РЕКОМЕНДУЙТЕ, що NC використовується, якщо нам потрібен конкретний порт

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.