각각 python simulate.py <parameter list>
.
나에게 필요한 것은 프로세스를 자동으로 종료하는 일종의 "런타임 제약" 명령입니다.Ctrl+C, 그러나 프로세스가 자체적으로 정상적으로 종료되지 않으면 지정된 시간 이후에 간단한 종료도 작동할 것이라고 생각합니다.
물론 이러한 스크립트를 직접 작성할 수도 있지만 누군가가 나보다 먼저 작성했는지 의심스럽기 때문에 바퀴를 재발명하기 위해 ps
, bash 매뉴얼 에 많은 시간을 소비할 필요가 없습니다 .time
답변1
잠재적인 솔루션 #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
프로그램은 데비안 저장소에서 찾을 수 있습니다.
답변3
다음을 사용하여 CPU 시간 및 기타 사항 ulimit
, 특히 CPU 시간을 조정할 수 있습니다.
$ ulimit -t 60 # limit to 60 seconds
$ program
답변4
$BASHPID
Bash는 이 경우에 사용할 수 있는 it이라는 변수를 사용합니다 . 예를 들면 다음과 같습니다.
#!/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
sleep
in 대신 호출 시 매개변수를 변경 do_face()
하고 자식이 집안일을 하는 데 너무 오랜 시간이 걸릴 때 어떤 일이 발생하는지 확인할 수 있습니다. sleep 호출을 실행 파일 호출로 변경하면 너무 오래 걸리면 스크립트가 해당 호출을 종료합니다. 이 예에서는 초 단위로 제한됩니다. 매개변수를 구현하면 호출할 수 있는 간단한 스크립트가 되고, 대량으로 호출하거나 다른 스크립트로 호출할 수 있습니다. 각 동시 프로세스에 대한 pid 파일을 처리하는 것은 다른 하위 디렉터리를 사용하여 처리해야 하는 문제입니다.100
10
do_face()
20
참고: GNU Linux에서는 10분의 1초 동안 절전 모드 sleep
와 같은 부동 소수점 매개변수를 사용할 수 있습니다 .sleep 0.1