이것은 꽤 이상하고 모든 것을 검색하고 시도했지만 여기서 멍청한 구문 오류를 만들고 있다고 생각합니다.
CPU에서 스트레스 테스트를 실행 한 다음 즉시 CPU 사용량을 30 %로 제한합니다.이 모든 것이 PHP를 통해 이루어집니다. 테스트는 또한 제한 될 수 있도록 지정된 이름으로 다른 사용자로 실행됩니다. 스트레스 테스트는 정상적으로 시작되지만 PHP 파일이 여전히로드되는 것을 볼 수 있으며 스트레스 테스트가 종료되는 두 번째 시점에 종료됩니다.
내가 시도한 몇 가지 방법은 다음과 같습니다.
$output = exec('sudo runuser -l test -c "exec -a MyUniqueProcessName stress -c 1 -t 60s & cpulimit -e MyUniqueProcessName -l 30"');
$output = exec('sudo runuser -l test -c "exec -a MyUniqueProcessName stress -c 1 -t 60s > /dev/null & cpulimit -e MyUniqueProcessName -l 30"');
이것의 전체 목적은 게임 호스팅 웹 사이트에 대한 스크립트를 작성하고 있으며, 품질을 향상시키고 누군가가 모든 리소스를 차지하지 않도록 각 서버의 리소스 소비를 제한하고 싶기 때문입니다. 기본적으로 스트레스 테스트 대신 게임 서버가 실행됩니다.
편집하다::
지금 내가 가진 것은 다음과 같습니다.
나는 "test"아래에서 스트레스를 실행해야하지만, 특별한 권한이 필요하기 때문에 sudo apache 또는 root 아래에서 cpulimit를 실행해야합니다. 스트레스는 여전히 잘 시작되지만 먹는다 99.9 %
passthru('sudo runuser -l test -c "exec -a MyUniqueProcessName stress -c 1 -t 60s &" & sudo cpulimit -e MyUniqueProcessName -l 30 -i -z');
http://i.imgur.com/iK2nL43.png 후 프로세스 목록에서 cpulimit를 볼 수 없습니다.
불행히도, &&
당신이 원하는 것과 다소 반대입니다. :-) A && B
Bash에서하면 "명령 A를 실행하고 완료 될 때까지 기다립니다. 성공하면 명령 B를 실행합니다."라는 의미입니다.
반대로, A & B
"명령 A를 실행 한 다음 명령 B를 즉시 실행"을 의미합니다.
그래서 당신은 당신의 명령에 가깝지만 두 개의 bash
명령 (하나만 필요)과 &&
.
또한 두 터미널에서 PHP 외부에서 각 명령을 개별적으로 실행 해 보셨습니까? 방금 stress 와 cpulimit를 모두 다운로드하여 빌드 하고 (이것들이 사용중인 것으로 가정합니까?), 명령을 개별적으로 실행하고 문제를 발견했습니다. cpulimit
여전히 백분율을 제한하지 않습니다.
에 대한 문서를 살펴보면 stress
자식 프로세스를 분기하여 작동한다는 것을 알 수 있으므로 CPU 제한을 시도하는 것은 부모이지만 CPU를 사용하는 것은 아닙니다. 제한된 것에 자식 프로세스를 포함하는 cpulimit --help
옵션이 있음을 보여줍니다 -i
.
이것은 하나의 터미널에 이것을 입력 할 수있는 지점을 얻습니다 (첫 번째 줄은 프롬프트에서 입력을 보여줍니다; 후속 쇼 출력) :
$> exec -a MyUniqueProcessName stress -c 1 -t 60s & cpulimit -e MyUniqueProcessName -l 30 -i
[1] 20229
MyUniqueProcessName: info: [20229] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
Process 20229 found
그런 다음 실행중인 다른 터미널에서 다음을 top
참조하십시오.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
20237 stackov+ 20 0 7164 100 0 R 30.2 0.0 0:04.38 stress
훨씬 낫다. (이를 별칭으로 지정한 Bash 셸 외부에서는 exec -a
프로세스 이름이으로 표시됩니다 stress
.) 불행히도 cpulimit
해당 이름을 가진 더 많은 프로세스를 "수신" 하는 또 다른 문제가 있습니다. 위로 cpulimit --help
밝혀, -z
옵션을 선택합니다.
복잡성을 약간 줄이려면 별칭을 해제하고 마지막으로 실행 된 프로세스의 PID를 참조 stress
하는 특수 Bash 변수를 통해 프로세스 의 PID를 사용할 수 있습니다 $!
. 터미널에서 다음을 실행하면 원하는 모든 작업을 수행 할 수 있습니다.
stress -c 1 -t 60s & cpulimit -p $! -l 30 -i -z
이제 배운 내용으로 PHP 스크립트를 변경하십시오.
exec('bash -c "exec -a MyUniqueProcessName stress -c 1 -t 60s & cpulimit -e MyUniqueProcessName -l 30 -i -z"');
... 또는 더 간단한 버전 :
exec('bash -c "stress -c 1 -t 60s & cpulimit -p \$! -l 30 -i -z"');
(에 전달 될 때 인용되는 방식으로 인해 $ in은 $!
백 슬래시로 이스케이프되어야 \$!
했습니다 bash -c
.)
최종 답변 :
질문을 수정 한 마지막 예를 바탕으로 다음과 같은 내용이 필요합니다.
passthru('bash -c "sudo -u test stress -c 1 -t 60s & sudo -u root cpulimit -p \$! -l 30 -i -z"');
를 사용하여 실행 php stackoverflow-question.php
하면 다음이 출력됩니다.
stress: info: [3374] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
stress: info: [3374] successful run completed in 60s
Process 3371 found
(두 번째 두 줄 은 PHP 스크립트가 완료된 후에 만 나타납니다. 오해하지 마십시오. top
확인에 사용 하십시오.)
top
PHP 스크립트가 실행되는 60 초 동안 다른 터미널에서 실행 중입니다.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3472 test 20 0 7160 92 0 R 29.5 0.0 0:07.50 stress
3470 root 9 -11 4236 712 580 S 9.0 0.0 0:02.28 cpulimit
이것은 정확히 당신이 원했던 것입니다 : stress
is running under the user test
, and cpulimit
is running under the user root
(둘 다 원하는 경우 명령에서 변경할 수 있음). stress
약 30 %로 제한됩니다.
다른 사용자로 프로세스를 실행하는 표준 방법 runuser
이기 때문에 익숙 하지 않고 적용 가능성이 보이지 않습니다 sudo
. 이 작업을 수행하려면 / etc / sudoers에서 설정을 조정해야 할 수 있습니다 (루트 액세스가 필요하지만 분명히 이미 가지고 있음). 이는이 논의의 범위를 완전히 벗어나지 만 예를 들어 다음 규칙을 추가했습니다.
my-user ALL=(test) NOPASSWD:NOEXEC: /home/my-user/development/stackoverflow/stress
my-user ALL=(root) NOPASSWD:NOEXEC: /home/my-user/development/stackoverflow/cpulimit
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다