리눅스에서 프로그램이 실행되는 시간을 제한하는 방법?


10

할 몇 가지 시뮬레이션이 있으며 각각은로 호출됩니다 python simulate.py <parameter list>. 이 시뮬레이션의 문제점은 일부가 quiting하지 않고 멈추기 때문에 간단한 스크립트로 일괄 적으로 실행할 수 없다는 것입니다.

내가 필요할 것은, 자동으로 프로세스를 종료 것 "런타임 - 제약"명령의 형태이다 (실제로 눌러 바람직 Ctrl + C를 하는 경우, 지정된 시간 이후,하지만 난 간단한 죽일뿐만 아니라 할 것입니다 생각) 그 과정은 그 자체로 우아하게 끝나지 않았습니다.

물론 그런 스크립트를 직접 작성할 수는 있지만 누군가가 이미 내 앞에서 스크립트를 작성했다고 의심하므로 ps, time및 bash 매뉴얼을 사용하여 휠 시간을 재발 명 할 필요가 없습니다 .

답변:


15

잠재적 솔루션 # 1

다음 timeout명령을 사용하십시오 .

$ date
Mon May  6 07:35:07 EDT 2013
$ timeout 5 sleep 100
$ date
Mon May  6 07:35:14 EDT 2013

당신은에 가드를 넣을 수 있습니다 timeout뿐만 아니라 명령 kill이 너무 일정 기간 후 중지하지 않은 경우 과정.

$ date
Mon May  6 07:40:40 EDT 2013
$ timeout -k 20 5 sleep 100
$ date
Mon May  6 07:40:48 EDT 2013

프로세스 sleep 100가 중지 된 후 최대 20 초 동안 기다렸다가 여전히 실행 중이면 신호를 timeout보냅니다 kill.

잠재적 인 해결책 # 2

더 위험한 방법이지만 다른 방법은 다음과 같습니다.

./myProgram &
sleep 1
kill $! 2>/dev/null && echo "myProgram didn't finish"

이 기술을 Stack Overflow 에서 Linux에서 프로그램 실행 시간 제한 이라는 제목의 질문에서 발견했습니다 . 특히이 답변 입니다.

참고 : @mattdm이 남긴 의견에 따르면 위의 방법은 프로세스 이후에 새로운 프로세스가 시작되지 않았다고 가정하면 위험 할 수 있습니다. 따라서 새로운 PID가 할당되지 않았습니다. 이를 감안할 때이 방법은 사용하지 말아야하며 여기에서는 일반적인 문제 접근 방법에 대한 참조로만 사용하십시오. 이 timeout방법은 2의 더 나은 옵션입니다.


그러나 스크립트는 항상 그 시간이 걸리는 것이 보장됩니다. 제 경우에는 1 초가 아니라 15 분입니다.
Adam Ryczkowski 11

그러나 그 질문에서 찾은 다른 해결책은 내가 필요한 것이어야합니다. 감사!
Adam Ryczkowski 11

2
myProgram보다 짧은 시간 내에 완료 한다고sleep 가정합니다 (목표는 최대 허용 런타임 을 설정하는 것이기 때문에 부당한 가정이 아님 ). 그런 다음 존재하지 않는 PID (실제로 피해를 입히지 않음) 또는 시스템의 임의의 프로세스 (잠재적으로 치명적) 로 신호를 보냅니다 .
CVn

1
@ MichaelKjörling, 지불 거절에 감사드립니다. OP가 남긴 동일한 의견에 따라 답변을 업데이트했습니다. timeout명령이 원하는 것을 정확하게 수행하여 OP가 내 의견에 응답하기를 기다리는 것처럼 보입니다 .
slm

@slm timeout이 필요한 솔루션이어야합니다. 나는 지금 그것을 시험하고있다
Adam Ryczkowski

4

나는보다 조금 더 나은 무언가를 발견했습니다 timeout: timelimit.

몇 가지 장점이 있습니다. 하나는 사용자가 "Ctrl + C"를 눌러 수동으로 실행을 중단 할 수 있다는 것입니다.

timelimit프로그램은 데비안 저장소에서 사용할 수 있습니다.


1
시간 제한과 시간 제한의 차이를 이해하려고합니다. 시간 종료는 Ctrl + C로 중지 할 수 있습니다. 다른 장점은 무엇입니까?
slm

글쎄, 내 타임 아웃 수 없습니다. Mint 14 (Ubuntu Quantal 기반)를 사용합니다.
Adam Ryczkowski

3

CPU 시간과 ulimit특히 CPU 시간을 사용 하여 CPU 시간 및 기타 사항을 조정할 수 있습니다 .

$ ulimit -t 60      # limit to 60 seconds
$ program

이 U & L Q & A ( unix.stackexchange.com/a/4666/7453)를 참조하십시오 . @Gilles는이 목적을위한 ulimit의 사용에 대한 좋은 개요를 제공합니다.
slm

0

Bash는 다음 $BASHPID과 같은 상황에서 사용할 수 있는 변수를 사용합니다 .

#!/bin/bash
do_face() {
    local parent=$1
    echo $BASHPID > pid
    sleep 10
    echo "Killing parent $parent"
    kill $parent
}

ME=$BASHPID
eval $(echo "do_face $ME &")
sleep 20 && kill $(cat pid) && echo "killed child $(cat pid)"
exit 1

당신은에 호출에서 인수를 변경할 수 있습니다 sleepdo_face()100대신 10하여 자녀가 집안일을하는 데 시간이 너무 오래 걸리는 경우 어떻게되는지. do_face()실행 파일 에 대한 호출로 잠자기 위해 호출을 변경하고 너무 오래 걸리면 스크립트가이를 종료합니다 20.이 예 에서는 초가 제한 값입니다. 매개 변수는이를 호출하기위한 간단한 스크립트가되고 배치 또는 다른 스크립트로 다른 스크립트에 의해 호출 될 수 있도록 구현 될 수 있습니다. 각 동시 프로세스에 대해 pid 파일을 처리하는 것은 처리해야 할 문제입니다. 아마 다른 하위 디렉토리를 사용하십시오 ...

주의 : GNU Linux 에서는 10 분의 1 초 동안 휴면 sleep과 같은 부동 소수점 인수를 사용할 수 있습니다 sleep 0.1.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.