프로세스를 특정 시간 / CPU 주기로 제한 할 수 있습니까?


16

웹 서버에서 실행되고 고객 조치에 의해 트리거되는 스크립트가 있습니다.이 스크립트는 유닉스 프로세스를 시작하여 일부 캐시 파일을 생성합니다. 이 프로세스는 고객이 제공 한 파일에 대해 수행되기 때문에 때때로 발생하는 PHP 프로세스가 시간 초과되거나 sysadmin이 종료 할 CPU 시간을 너무 많이 사용하도록 오작동합니다.

프로세스의 CPU 시간 / 런타임을 제한하는 명령을 실행할 수 있습니까? 나는 같은 명령을 찾고 /usr/bin/time있는데, 여기서 해당 명령을 실행하고 실행하고 제한하려는 명령 줄을 전달할 수 있습니다.

답변:


13

Gilles 답변 외에도 런타임에서 수정을 포함하여 원하는 것을 정확하게 수행하는 cpulimit 도구가 있습니다. 또한 특정 CPU / 코어 IIRC로만 제한 할 수 있습니다.


12

프로그램 내에서을 호출하십시오 setrlimit(RLIMIT_CPU, ...). 쉘에서 호출하십시오 ulimit -t 42(이것은 표준은 아니지만 대부분의 유닉스 변형에서 대부분의 쉘 (bash 및 ksh 포함)에서 지원합니다). 이로 인해 N 초의 CPU 시간이 소모되면 현재 프로세스가 종료됩니다. 이 제한은 자식 프로세스에 의해 상속됩니다. 일반적인 쉘 관용구는 (ulimit -t 42; runaway_process)나중에 동일한 쉘에서 다른 무제한 프로세스를 실행하려는 경우입니다.

참고 특정 프로세스가 유닉스에서 사용할 수있는 메모리의 양을 제한하는 방법이 있나요? . 원칙은 동일하며 다른 리소스를 제한하는 것입니다.


문제는 프로그램에 대한 소스 코드가 없어서 추가 할 수없고 setrlimitPHP를 통해 생성하므로 쉘이 없기 때문입니다.
Josh

6
@Josh :와 유사한 구문을 찾고 있다면을 time php /cgi/foo.php사용할 수 있습니다 bash -c 'ulimit -t 42; exec "$0" "$@"' php /cgi/foo.php.
Gilles 'SO- 악마 중지'12

@ 조쉬 아파치? 또한이 물건은 시스템 전체를 설정할 수 있다고 생각합니다 ...
xenoterracide

@xenoterracide 그렇습니다. 아파치이지만 모든 아파치 프로세스가 아니라이 프로세스 만 제한하고 싶습니다. Gilles의 bash oneliner가 훌륭하게 작동 할 수 있습니다!
Josh

3

또한 timeout명령을 사용하여 지정된 시간보다 오래 프로세스가 실행되지 않도록 차단할 수 있습니다 .

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

자세한 내용은 타임 아웃 매뉴얼 페이지 를 참조하십시오.

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