Hat Curl eine Auszeit?


251

Bisher konnte ich nichts wirklich finden, aber ist es wahr, dass es curlüberhaupt nicht zu einer Zeitüberschreitung kommt?

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

Ich frage, weil ich jede Anfrage nach Bildern in testdirein separates Apache-Modul umleite, das diese Bilder im laufenden Betrieb generiert. Es kann bis zu 15 Minuten dauern, bis das Bild tatsächlich fertig ist und an den anfordernden Client geliefert wird.

Wird curlimmer warten (oder ist es abhängig von der Konfiguration) oder gibt es irgendeine Art von Zeitüberschreitung?


3
Ich würde erwarten, dass curl ein Timeout für die Verbindung hat (wenn nichts anderes der Fall ist, hat das Betriebssystem und sein TCP / IP-Stack mit ziemlicher Sicherheit ein Timeout für das Lesen, sobald die Verbindung hergestellt wurde.
ein Lebenslauf vom

Antworten:


340

Ja.

Timeout-Parameter

curlhat zwei Möglichkeiten: --connect-timeoutund --max-time.

Zitat aus der Manpage:

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

und:

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

Standardeinstellungen

Hier (unter Debian) hört es nach 2 Minuten auf, eine --connect-timeoutVerbindung herzustellen , unabhängig von der mit angegebenen Zeit, und obwohl der Standardwert für das Verbindungs-Timeout laut Makro in lib / connect.h 5 Minuten zu sein scheint .DEFAULT_CONNECT_TIMEOUT

Ein Standardwert für --max-timescheint nicht vorhanden zu sein, sodass curlauf eine Antwort für immer gewartet werden muss, wenn die erste Verbindung erfolgreich ist.

Was zu benutzen?

Sie interessieren sich wahrscheinlich für die letztere Option --max-time. Stellen Sie für Ihren Fall 900(15 Minuten) ein.

Die Angabe einer Option --connect-timeoutfür 60(eine Minute) könnte ebenfalls eine gute Idee sein. Andernfalls curlwird versucht, immer wieder eine Verbindung herzustellen, anscheinend mit einem Backoff-Algorithmus.


2
Dank dafür! --max-time sagt nichts über Standardwerte aus, also habe ich denke, es hat kein und daher kein Timeout außer dem Verbindungs-Timeout standardmäßig ...?
Preexo

4
Ja, wenn die Verbindung erfolgreich ist, scheint curl ewig auf eine Antwort zu warten.
Scai

Beachten Sie, dass sowohl maxtime ein Problem ist, wenn die Antwort ein großer Download ist, der länger als 'maxtime' dauert.
user92979

1
Das 2-minütige Timeout riecht für mich auch nach einer Server-Auszeit. Hatte gerade das gleiche Problem mit dem http-Server einer Node.js-App, die ein Standard-Timeout von 2 Minuten hat. Informationen zum Erhöhen finden Sie unter HTTP.server.setTimeout () .
Thalis K.

17

Es gibt ein Zeitlimit: / usr / bin / timelimit - begrenzt effektiv die absolute Ausführungszeit eines Prozesses

 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
Mindestens unter macOS 10.13.4 standardmäßig nicht verfügbar.
Thorbjørn Ravn Andersen

14

Besser als --max-timedie --speed-limitund --speed-timeOptionen. Kurz gesagt, --speed-limitgibt die minimale Durchschnittsgeschwindigkeit an, die Sie akzeptieren möchten, und --speed-timegibt an, wie lange die Übertragungsgeschwindigkeit unter dieser Grenze bleiben kann, bevor die Übertragung abläuft und abgebrochen wird.


9
Ich denke, beides ist nicht besser, aber in meinem Anwendungsfall ist --max-time eigentlich angemessener, da alles, was länger als 10 Sekunden ist, mein Programm unbrauchbar machen würde.
Jorge Bucaran

Ich verwende curl als Bibliothek in einer Desktop-Anwendung (und rufe es nicht nur über die CLI auf), und für mich war Ihre Option die beste Lösung. Meine App muss in der Lage sein, lange Downloads zu unterstützen, daher war eine einfache --max-Zeit keine gute Lösung, um "feststeckende Downloads" zu erkennen (was der Fall ist, wenn der Benutzer beispielsweise offline geht, während ein Download ausgeführt wird) Fortschritt), also ging ich mit einem Tempolimit von 1024 und einer Geschwindigkeitszeit von 30, um diese zu erkennen.
André Morujão

1
Nützlich? Bestimmt. Besser? Ich denke, das hängt sehr von Ihren Anforderungen ab
Brian Agnew

Zeitüberschreitungen sind ein Problem, wenn die Antwort ein großer Download unbekannter (oder sogar bekannter!) Größe sein könnte. Die maximale Zeit wird überschritten, wenn der große Download z. B. länger als 15 Minuten dauert. Und die Geschwindigkeitsbegrenzungen können von Proxys ausgelöst werden, die die gesamte Antwort zuerst zwischenspeichern, bevor sie etwas weiterleiten. Sie scheinen manchmal 1 Byte pro Minute weiterzuleiten, aber wie erkennen Sie, ob dies ein Caching-Proxy in einem schnellen Netzwerk ist oder eine sehr langsame Verbindung, die wiederholt werden sollte? Also habe ich aufgegeben und Timeouts für Download-Abfragen deaktiviert. Ich bin mir nicht sicher, ob es einen besseren Weg gibt.
user92979

3

Wenn Sie coreutils unter MacOS installiert haben, können Sie den GNU-Befehl timeout verwenden, der in diesem Paket enthalten ist. Den GNU-Werkzeugen wird ein vorangestellt, gso wie es die CLI sein würde gtimeout.

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

Beispiel

$ 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

Einige Lösungen in 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
}

Beispielgebrauch:

EMPFEHLEN, DASS NC verwendet wird, wenn wir einen bestimmten Port benötigen

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.