This commit is contained in:
2025-10-17 10:31:09 +08:00
parent 37924aa27d
commit f55b876aa6

View File

@@ -1,22 +1,33 @@
<?php <?php
/** /**
* 执行多个webman相关的nohup命令 * 修复阻塞问题的 Webman 进程启动脚本
* 关键:重定向所有输出 + 脱离终端,避免 nohup 占用输入流
*/ */
/** // 1. 定义命令(指定日志路径 + 重定向所有输出 + 脱离终端)
* 批量启动 Webman 进程的 PHP 脚本 // 注:日志路径可自定义,确保目录有写入权限(如 ./logs/ 需提前创建)
* 功能:执行多个 nohup 命令,启动指定的 Webman 任务并后台运行
*/
// 定义需要执行的命令列表
$commands = [ $commands = [
'nohup php webman applysmstemp &', // Linux/macOS用 setsid 脱离终端,输出重定向到单独日志
'nohup php webman birthdaygiftsms &', 'nohup php webman applysmstemp > ./logs/applysmstemp.log 2>&1 & setsid $!',
'nohup php webman rabborderprint &', 'nohup php webman birthdaygiftsms > ./logs/birthdaygiftsms.log 2>&1 & setsid $!',
'nohup php webman rabbproductupdate &' '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 "开始启动 Webman 进程...\n";
echo "----------------------------------------\n"; echo "----------------------------------------\n";
@@ -24,18 +35,28 @@ foreach ($commands as $index => $cmd) {
$commandNum = $index + 1; $commandNum = $index + 1;
echo "执行命令 {$commandNum}: {$cmd}\n"; echo "执行命令 {$commandNum}: {$cmd}\n";
// 执行命令(使用 shell_exec 执行并获取输出) // 关键:用 proc_open 替代 shell_exec强制关闭终端关联避免阻塞
$output = shell_exec($cmd . ' 2>&1'); // 重定向错误输出到标准输出 $descriptors = [
0 => ['pipe', 'r'], // 标准输入(关闭,避免占用)
// 检查命令是否成功执行nohup 后台命令通常返回空,但可通过进程是否存在验证 1 => ['pipe', 'w'], // 标准输出(忽略
if ($output === null) { 2 => ['pipe', 'w'] // 标准错误(忽略)
echo "命令 {$commandNum} 启动成功(后台运行)\n"; ];
$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 { } else {
echo "命令 {$commandNum} 执行输出: {$output}\n"; echo "命令 {$commandNum} 启动失败!\n";
} }
echo "----------------------------------------\n"; echo "----------------------------------------\n";
} }
echo "所有命令执行完毕\n"; echo "所有命令执行完毕\n";
echo "可通过 'ps aux | grep webman' 查看运行中的进程。\n"; echo "查看进程:ps aux | grep webman\n";
echo "可通过 'kill [进程ID]' 停止指定进程。\n"; echo "查看日志cat ./logs/[进程名].log\n";
echo "停止进程kill [进程ID]\n";