PHP를 통해 두 개의 Linux 명령을 실행하고 두 번째를 실행하기 전에 먼저 끝날 때까지 기다리지 마십시오.

Carnacov

이것은 꽤 이상하고 모든 것을 검색하고 시도했지만 여기서 멍청한 구문 오류를 만들고 있다고 생각합니다.

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 && BBash에서하면 "명령 A를 실행하고 완료 될 때까지 기다립니다. 성공하면 명령 B를 실행합니다."라는 의미입니다.

반대로, A & B"명령 A를 실행 한 다음 명령 B를 즉시 실행"을 의미합니다.

그래서 당신은 당신의 명령에 가깝지만 두 개의 bash명령 (하나만 필요)과 &&.

또한 두 터미널에서 PHP 외부에서 각 명령을 개별적으로 실행 해 보셨습니까? 방금 stresscpulimit를 모두 다운로드하여 빌드 하고 (이것들이 사용중인 것으로 가정합니까?), 명령을 개별적으로 실행하고 문제를 발견했습니다. 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확인에 사용 하십시오.)

topPHP 스크립트가 실행되는 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

이것은 정확히 당신이 원했던 것입니다 : stressis running under the user test, and cpulimitis 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관