이 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
보고하므로 종료 상태가 셸에 보고되고 , 원격 셸은 실행한 마지막 명령의 종료 상태로 종료되어 보고됩니다. 원격 쉘의 종료 상태입니다.sudo
ssh
이제 관례에 따라 명령은 0이 아닌 종료 상태를 반환하여 요청받은 작업을 완료하지 않았음을 호출자에게 보고합니다.
귀하의 경우 /etc/init.d/smokeping
발생하는 오류는 0이 아닌 종료 상태를 보장하기에 충분하지 않은 것으로 간주되거나 스크립트가 잘못 작성되어 실패 시 0이 아닌 종료 상태로 반환되지 않습니다(또는 오작동 또는 일부 병리학적 조건이 포함됨). ssh
또는 sudo
원격 셸 구성 오류).
/etc/init.d
스크립트는 일반적으로 를 사용하여 작성됩니다 set -e
. 이 플래그를 활성화하면 실행 중인 명령이 실패하면(실패한 명령의 종료 상태가 0이 아님) 스크립트를 해석하는 셸이 기본적으로 종료되므로 첫 번째 경우일 수 있다고 생각됩니다. : "smoke" 실제로 리로드에 성공했다고 보고하기로 결정했습니다.
병리학적 상황의 예는 다음과 같습니다. bash
원격 쉘로 사용되며(대화형 쉘이 아니더라도 호출 시 읽음 bash
) 다음과 같습니다.~/.bashrc
ssh
~/.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. )
이제 여기서 처리할 수 있습니다. 다들 감사 해요.