./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";