curl에 시간 초과가 있습니까?


251

지금까지 나는 아무것도 찾을 수 없었지만 curl실제로 시간이 초과되지 않는 것이 사실 입니까?

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

이미지 요청을 testdir별도의 Apache 모듈로 리디렉션 하여 즉시 사진을 생성 하기 때문에 묻습니다 . 사진이 실제로 준비되어 요청 클라이언트에게 전달되기까지 최대 15 분이 걸릴 수 있습니다.

curl항상 대기 (또는 구성에 따라한다) 또는 타임 아웃의 어떤 종류가 있습니까?


3
curl에 연결 시간 초과가 있을 것으로 예상 하지만 (다른 것이 없으면 OS와 해당 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.

기본값

여기서 (데비안에서는) lib / connect.h 의 매크로에 따라 --connect-timeout기본 연결 시간 초과 값이 5 분인 것처럼 보이지만 2 분 후에 연결 시도가 중지 됩니다 .DEFAULT_CONNECT_TIMEOUT

에 대한 기본값 --max-time이 존재하지 않는 것 같습니다 curl. 초기 연결에 성공하면 응답을 영원히 기다립니다.

무엇을 사용해야합니까?

후자의 옵션에 관심이있을 것입니다 --max-time. 귀하의 경우에는 900(15 분)으로 설정하십시오 .

옵션 --connect-timeout60(1 분) 같은 것으로 지정 하는 것도 좋습니다. 그렇지 않으면 curl분명히 일부 백 오프 알고리즘을 사용하여 계속해서 연결을 시도합니다.


2
고마워! --max-time은 기본값에 대해 아무 말도하지 않으므로 기본값으로 연결 시간 초과를 제외하고 시간 초과가 없다고 생각합니다 ...?
Preexo

4
예, 경우 연결 후 성공 컬 응답을 영원히 기다려야 할 것 같다.
scai

응답이 'maxtime'보다 오래 걸리는 큰 다운로드 인 경우 두 maxtime이 모두 문제입니다.
user92979

1
2 분 시간 초과는 서버 시간 초과처럼 나에게 냄새가납니다. 기본 시간 제한이 2 분인 Node.js 앱의 http 서버와 동일한 문제가 있습니다. 이를 늘리려면 HTTP.server.setTimeout ()을 참조하십시오 .
Thalis K.

17

시간 제한이 있습니다 : / 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
어느 쪽도 나아지지는 않지만 내 유스 케이스에서는 최대 시간이 실제로 더 적절합니다 .10 초 이상이면 프로그램이 쓸모 없게되기 때문입니다.
Jorge Bucaran

CLI에서 호출하지 않고 데스크톱 응용 프로그램에서 curl을 라이브러리로 사용하고 있으며 귀하의 옵션이 가장 적합했습니다. 내 앱은 긴 다운로드를 지원할 수 있어야하므로 간단한 --max-time은 "고착 된 다운로드"를 감지하기에 적합하지 않습니다 (예 : 다운로드가 진행되는 동안 사용자가 오프라인 상태 인 경우) 진행), 그래서 나는 이것을 감지하기 위해 1024의 제한 속도와 30의 제한 시간으로 갔다.
André Morujão

1
유능한? 확실히. 보다 나은? 나는 당신의 요구 사항에 매우 의존 생각
브라이언 애그뉴

응답이 알 수없는 (또는 알려진!) 크기의 큰 다운로드 일 수있는 경우 시간 종료는 문제가됩니다. 큰 다운로드에 15 분 이상 걸리는 경우 maxtime이 시간 초과됩니다. 그리고 속도 제한은 무엇이든 전달하기 전에 먼저 전체 응답을 캐시하는 프록시에 의해 트립 될 수 있습니다. 때로는 분당 1 바이트를 전달하는 것처럼 보이지만 빠른 네트워크의 캐싱 프록시인지 또는 다시 시도 해야하는 매우 느린 연결인지 어떻게 알 수 있습니까? 결국 나는 다운로드 쿼리에 대한 시간 초과를 포기하고 해제했습니다. 더 좋은 방법이 있는지 확실하지 않습니다.
user92979

3

MacOS에 coreutils가 설치되어 있으면 해당 패키지에 포함 된 GNU timeout 명령을 사용할 수 있습니다. 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.