diff --git a/Server/application/command/TaskSchedulerCommand.php b/Server/application/command/TaskSchedulerCommand.php index 3586622f..82af207f 100644 --- a/Server/application/command/TaskSchedulerCommand.php +++ b/Server/application/command/TaskSchedulerCommand.php @@ -580,6 +580,13 @@ class TaskSchedulerCommand extends Command // [DEBUG] 记录关闭管道前的状态 file_put_contents($logFile, "[DEBUG] 准备关闭管道,输出长度: " . strlen($output) . ", 错误长度: " . strlen($error) . "\n", FILE_APPEND); + // 在关闭管道前,再次获取进程状态以获取准确的退出码 + $finalStatus = proc_get_status($process); + $exitCodeFromStatus = isset($finalStatus['exitcode']) ? $finalStatus['exitcode'] : null; + + file_put_contents($logFile, "[DEBUG] 关闭管道前的最终状态: " . json_encode($finalStatus, JSON_UNESCAPED_UNICODE) . "\n", FILE_APPEND); + file_put_contents($logFile, "[DEBUG] proc_get_status 返回的退出码: " . ($exitCodeFromStatus !== null ? $exitCodeFromStatus : 'null') . "\n", FILE_APPEND); + // 关闭管道 $closeResults = []; $closeResults['stdin'] = @fclose($pipes[0]); @@ -588,17 +595,30 @@ class TaskSchedulerCommand extends Command file_put_contents($logFile, "[DEBUG] 管道关闭结果: " . json_encode($closeResults, JSON_UNESCAPED_UNICODE) . "\n", FILE_APPEND); // 获取退出码 - $exitCode = proc_close($process); + $exitCodeFromClose = proc_close($process); // [DEBUG] 记录退出码获取结果 - file_put_contents($logFile, "[DEBUG] proc_close 返回的退出码: {$exitCode}\n", FILE_APPEND); - file_put_contents($logFile, "[DEBUG] 退出码类型: " . gettype($exitCode) . "\n", FILE_APPEND); - if ($exitCode === -1) { - file_put_contents($logFile, "[DEBUG] ⚠️ 退出码为 -1,可能原因:\n", FILE_APPEND); - file_put_contents($logFile, "[DEBUG] 1. 进程被信号终止\n", FILE_APPEND); - file_put_contents($logFile, "[DEBUG] 2. 进程异常终止\n", FILE_APPEND); - file_put_contents($logFile, "[DEBUG] 3. 无法获取进程退出状态\n", FILE_APPEND); - file_put_contents($logFile, "[DEBUG] 4. Windows系统上的特殊返回值\n", FILE_APPEND); + file_put_contents($logFile, "[DEBUG] proc_close 返回的退出码: {$exitCodeFromClose}\n", FILE_APPEND); + file_put_contents($logFile, "[DEBUG] 退出码类型: " . gettype($exitCodeFromClose) . "\n", FILE_APPEND); + + // 优先使用 proc_get_status 的退出码,因为 proc_close 在某些情况下会错误返回 -1 + // 如果 proc_get_status 有退出码且进程已结束,使用它;否则使用 proc_close 的返回值 + if ($exitCodeFromStatus !== null && !$finalStatus['running']) { + $exitCode = $exitCodeFromStatus; + file_put_contents($logFile, "[DEBUG] ✅ 使用 proc_get_status 的退出码: {$exitCode}\n", FILE_APPEND); + if ($exitCodeFromClose === -1 && $exitCode === 0) { + file_put_contents($logFile, "[DEBUG] ℹ️ 注意: proc_close 返回 -1,但 proc_get_status 显示退出码为 0,这是 PHP 的已知行为,任务实际执行成功\n", FILE_APPEND); + } + } else { + $exitCode = $exitCodeFromClose; + file_put_contents($logFile, "[DEBUG] 使用 proc_close 的退出码: {$exitCode}\n", FILE_APPEND); + if ($exitCode === -1) { + file_put_contents($logFile, "[DEBUG] ⚠️ 退出码为 -1,可能原因:\n", FILE_APPEND); + file_put_contents($logFile, "[DEBUG] 1. 进程被信号终止\n", FILE_APPEND); + file_put_contents($logFile, "[DEBUG] 2. 进程异常终止\n", FILE_APPEND); + file_put_contents($logFile, "[DEBUG] 3. 无法获取进程退出状态\n", FILE_APPEND); + file_put_contents($logFile, "[DEBUG] 4. Windows系统上的特殊返回值\n", FILE_APPEND); + } } // 记录输出