This commit is contained in:
wong
2026-01-19 10:39:51 +08:00
parent 6b31889261
commit e356ae67c7

View File

@@ -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);
}
}
// 记录输出