proc_open でexitcode を取得すると -1 になる
proc_open の関数で、exitcode を参照すると、常に -1 が固定で返ってくる件
proc_get_status($process)['exitcode']; // -1 proc_get_status($process)['exitcode']; // -1
array:8 [ "command" => "ssh" "pid" => 6694 "running" => false "signaled" => false "stopped" => false "exitcode" => -1 "termsig" => 0 "stopsig" => 0 ]
原因
プロセス終了後に status 取得すると、常に -1 しか返ってこない。そういうものである
対策。
proc_get_status($process)['running']
が false
になった瞬間の status を保存しておくと exitcode が正しく取れる。
終了後に初めて呼び出したときに、正しいexitcode が取れる。それ以降は「終了済み」を示す -1 が常に返ってくる。
<?php $cmd = ['ssh','localhost', '/bin/noexists_command']; $process = proc_open($cmd, [2=>$fd_ferr=fopen('php://temp','w')] , $pipes); if( ! is_resource($process) ) { throw new \Exception("実行エラー");} do { $stat = proc_get_status($process); // waiting usleep(1000*1); } while($stat['running']); if ($stat['exitcode'] > 0 ){ fseek($fd_ferr,0); $err = stream_get_contents($fd_ferr); throw new \Exception($err); }
これは、気づかんわ。
参考資料
https://stackoverflow.com/questions/7645499/getting-the-real-exit-code-after-proc-open