p_ysk/start_webman_commands.php

62 lines
2.6 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* 修复阻塞问题的 Webman 进程启动脚本
* 关键:重定向所有输出 + 脱离终端,避免 nohup 占用输入流
*/
// 1. 定义命令(指定日志路径 + 重定向所有输出 + 脱离终端)
// 注:日志路径可自定义,确保目录有写入权限(如 ./logs/ 需提前创建)
$commands = [
// Linux/macOS用 setsid 脱离终端,输出重定向到单独日志
'nohup php webman applysmstemp > ./logs/applysmstemp.log 2>&1 & setsid $!',
'nohup php webman birthdaygiftsms > ./logs/birthdaygiftsms.log 2>&1 & setsid $!',
'nohup php webman rabborderprint > ./logs/rabborderprint.log 2>&1 & setsid $!',
'nohup php webman rabbproductupdate > ./logs/rabbproductupdate.log 2>&1 & setsid $!',
// 若为 Windows 系统替换为以下命令start /b 后台运行,输出重定向)
// 'start /b nohup php webman applysmstemp > ./logs/applysmstemp.log 2>&1',
// 'start /b nohup php webman birthdaygiftsms > ./logs/birthdaygiftsms.log 2>&1',
// 'start /b nohup php webman rabborderprint > ./logs/rabborderprint.log 2>&1',
// 'start /b nohup php webman rabbproductupdate > ./logs/rabbproductupdate.log 2>&1',
];
// 2. 提前创建日志目录(避免日志写入失败)
$logDir = './logs';
if (!is_dir($logDir)) {
mkdir($logDir, 0755, true); // 0755 是目录权限true 支持创建多级目录
echo "已创建日志目录:{$logDir}\n";
}
// 3. 批量执行命令(非阻塞)
echo "开始启动 Webman 进程...\n";
echo "----------------------------------------\n";
foreach ($commands as $index => $cmd) {
$commandNum = $index + 1;
echo "执行命令 {$commandNum}: {$cmd}\n";
// 关键:用 proc_open 替代 shell_exec强制关闭终端关联避免阻塞
$descriptors = [
0 => ['pipe', 'r'], // 标准输入(关闭,避免占用)
1 => ['pipe', 'w'], // 标准输出(忽略)
2 => ['pipe', 'w'] // 标准错误(忽略)
];
$process = proc_open($cmd, $descriptors, $pipes);
if (is_resource($process)) {
// 关闭所有管道,彻底脱离终端
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
// 不等待进程结束(避免阻塞)
proc_close($process);
echo "命令 {$commandNum} 启动成功(后台运行,日志见 ./logs/\n";
} else {
echo "命令 {$commandNum} 启动失败!\n";
}
echo "----------------------------------------\n";
}
echo "所有命令执行完毕!\n";
echo "查看进程ps aux | grep webman\n";
echo "查看日志cat ./logs/[进程名].log\n";
echo "停止进程kill [进程ID]\n";