리눅스에서 프로그램이 실행되는 시간을 제한하는 방법? 실행할 수 없다는 것입니다. 내가 필요할 것은, 자동으로

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

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

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



답변

잠재적 솔루션 # 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의 더 나은 옵션입니다.


답변

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

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

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


답변

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

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


답변

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.


답변