설정된 시간 내에 명령을 호출하고, 시간이 지나면 종료하는 방법이 있나요? [복사]

설정된 시간 내에 명령을 호출하고, 시간이 지나면 종료하는 방법이 있나요? [복사]

중복 가능성:
지정된 시간 동안 명령을 실행하고 시간을 초과하면 중단합니다.

이와 같은 명령이 필요할 때 지속적인 통합 빌드 스크립트를 개발 중입니다. 기본적으로 명령이 종료되기 전에 실행되도록 설정된 시간 제한으로 명령을 시작해야 하며, 명령이 백그라운드에서 시간 제한 프로세스를 시작하면 진행 중인 모든 명령이 기다리지 않고 즉시 실행되어야 합니다. 일종의 비동기 동시성입니다.

이것이 내가 상상하는 것입니다:

timelimited --limit=10 'somecommand --someoptions'
someothercommand //This gets launched immediately once 'timelimited' is done creating the background process

답변1

timeout및를 사용할 수 없는 경우 doalarm(예: OS X) 다음을 사용할 수 있습니다 expect.

timeout() {

    time=$1

    # start the command in a subshell to avoid problem with pipes
    # (spawn accepts one command)
    command="/bin/sh -c \"$2\""

    expect -c "set echo \"-noecho\"; set timeout $time; spawn -noecho $command; expect timeout { exit 1 } eof { exit 0 }"    

    if [ $? = 1 ] ; then
        echo "Timeout after ${time} seconds"
    fi

}

답변2

BASH FAQ 항목 #68:"명령을 실행하고 N초 후에 명령을 중단(시간 초과)하도록 하는 방법은 무엇입니까?"

첫 번째실행 중인 명령이 시간 초과되었음을 직접 알 수 있는지 확인하십시오. 여기에 설명된 방법은 일정 시간이 지난 후 명령을 강제로 종료하는 "해키" 해결 방법입니다. 올바르게 구성하는 명령은 다음과 같습니다.언제나아래 대안보다 낫습니다.

명령이 지정된 시간 이후 중지를 기본적으로 지원하지 않는 경우 가장 좋은 대안은 다음과 같습니다.정지시키다그리고경보. 일부 Linux 배포판은 timeouttct 버전을 패키지로 제공합니다. 최근 coreutils 릴리스에는 GNU 버전의 timeout도 포함되어 있습니다.

답변3

또 다른 가능성은 이 작업을 수동으로 수행하는 것입니다. 그러나 Ignacio가 답변에서 제안한 옵션을 사용할 수 없는 경우에만 이 작업을 수행합니다.

timeout_f () {
    $1 &
    sleep $2
    kill $! # ends somecommand if still running
}

timeout_f 'somecommand --someoptions' 10 && #need 2 &'s
echo "forked.." # happens immediately

관련 정보