오류가 발생해도 PHP exec 명령 결과가 0입니다.

오류가 발생해도 PHP exec 명령 결과가 0입니다.

이 PHP 코드가 있습니다.

$execout=exec('ssh [email protected] "sudo /etc/init.d/smokeping reload"',$output1,$result);
if($result !=0){
    echo"that can't reload";
}
else{
    echo "successfully reloaded";
}

이 코드에서는 항상 . $result = 0이 제공됩니다. 가끔 스모킹에 오류가 있는 경우 명령줄에 다음 명령을 입력하면 오류가 표시되는 경우가 있는데,

ssh [email protected] "sudo /etc/init.d/smokeping reload"

그러면 이런 오류 메시지가 나타납니다.

* Reloading latency logger daemon configuration...
ERROR: can't open /etc/smokeping/devices/errorfilename: No such file or   directory
 ...done.

그래서 오류가 있지만 $result매번 0과 같은 값을 제공합니다. (오류는 없는지)

exec 명령이 왜 이렇게 동작합니까(php 및 CLI에서)?

답변1

존재하다

ssh [email protected] "sudo /etc/init.d/smokeping reload"

너의 껍질

(1) (또는 귀하의 예에서는 PHP가 시작한 쉘 exec()) 명령 줄을 구문 분석하고 발견되면 실행합니다.ssh

(2) 연락순서sshd

(3) xxx.xxx.xxx.xx인증 성공 후 서버 호출shell

(4) 명령줄을 해석 sudo하고 실행합니다.sudo

(5) 권한 확인 후 실행할 명령어/etc/init.d/smokeping

(6) 그 자체가 여러 명령을 실행하는 쉘 스크립트일 수 있습니다.

실패할 수 있는 몇 가지 사항이 있습니다. 1~5단계가 모두 성공하면 실행 한 명령의 종료 상태를 /etc/init.d/smokeping보고하므로 종료 상태가 셸에 보고되고 , 원격 셸은 실행한 마지막 명령의 종료 상태로 종료되어 보고됩니다. 원격 쉘의 종료 상태입니다.sudossh

이제 관례에 따라 명령은 0이 아닌 종료 상태를 반환하여 요청받은 작업을 완료하지 않았음을 호출자에게 보고합니다.

귀하의 경우 /etc/init.d/smokeping발생하는 오류는 0이 아닌 종료 상태를 보장하기에 충분하지 않은 것으로 간주되거나 스크립트가 잘못 작성되어 실패 시 0이 아닌 종료 상태로 반환되지 않습니다(또는 오작동 또는 일부 병리학적 조건이 포함됨). ssh또는 sudo원격 셸 구성 오류).

/etc/init.d스크립트는 일반적으로 를 사용하여 작성됩니다 set -e. 이 플래그를 활성화하면 실행 중인 명령이 실패하면(실패한 명령의 종료 상태가 0이 아님) 스크립트를 해석하는 셸이 기본적으로 종료되므로 첫 번째 경우일 수 있다고 생각됩니다. : "smoke" 실제로 리로드에 성공했다고 보고하기로 결정했습니다.

병리학적 상황의 예는 다음과 같습니다. bash원격 쉘로 사용되며(대화형 쉘이 아니더라도 호출 시 읽음 bash) 다음과 같습니다.~/.bashrcssh~/.bashrc

trap 'whatever...; exit 0' EXIT

ssh이로 인해 대화형 셸 또는 셸이 다시 시작되거나 rsh항상 상태로 종료됩니다 0.

답변2

2>&1나는 작은 대답을 찾았습니다. 위의 코드는 맨 마지막에 넣었습니다. ~처럼

$execout=exec('ssh [email protected] "sudo /etc/init.d/smokeping reload 2>&1"',$output1,$result);

다시 로드하려고 하는 응용 프로그램(스모킹)에 오류가 발생할 때 표시되는 print_r($output);오류는 다음과 같습니다.

Array ( [0] => * Reloading latency logger daemon configuration... [1] => ERROR: can't open /etc/smokeping/devices/errorfilename: No such file or directory [2] => ...done. )

이제 여기서 처리할 수 있습니다. 다들 감사 해요.

관련 정보