通过 PHP 执行的批处理文件将所有命令作为后台进程运行


Batch File executed via PHP runs all commands as background processes

我在处理批处理文件并通过 PHP 执行它时遇到问题。

我们有一些节点服务器和Avaya CMS在访问受限的服务器上运行。

服务器需要每天重新启动,因为它们有时会崩溃,所以我创建了一个批处理文件来关闭所有cmd窗口,节点和avaya。

然后它打开所有节点服务器和 avaya,启动登录 avaya 的 AHK 脚本,最后启动一些 avaya 报告。

当我双击批处理文件时,或者如果我通过任务计划程序运行它,这一切都运行良好,但是我们现在希望能够通过在 PHP 页面上单击按钮来运行它。

这就是我遇到麻烦的地方。

据我所知,当我单击按钮时,批处理文件会运行,关闭所有节点服务器,仅此而已,或者我是这么认为的。

通过一些挖掘,我发现它实际上是在执行整个批处理文件,但是它将所有cmd窗口和avaya作为后台进程运行,我认为这就是我的问题所在。

AFAIK 从 PHP 执行批处理文件时,无法打开 cmd,但是我认为批处理文件本身将在前台运行 cmd 窗口和 avaya。

有没有办法实现这一目标?

下面的代码,以备不时之需。

.PHP

$test = escapeshellcmd('C:'Windows'System32'cmd.exe /k 
"C:'wamp'www'batch_files'R - Wallboards Script"');
system($test);

批处理文件

title Launching Servers...
echo Kill Avaya
@echo off
taskkill /f /im "acsCNTRL.exe" /T
taskkill /f /im "acsApp.exe" /T
taskkill /f /im "wscript.exe" /T
taskkill /f /im "ACScript.exe" /T
taskkill /f /im "acsSRV.exe" /T
taskkill /f /im "acsRep.exe" /T

@echo off
call getCmdPID
set "current_pid=%errorlevel%"
for /f "skip=3 tokens=2 delims= " %%a in ('tasklist /fi "imagename eq cmd.exe"') do (
if "%%a" neq "%current_pid%" (
TASKKILL /PID %%a /f /T >nul 2>nul
)
)
timeout 5
echo Kill Node
for /f "skip=3 tokens=2 delims= " %%a in ('tasklist /fi "imagename eq node.exe"') do (
if "%%a" neq "%current_pid%" (
TASKKILL /PID %%a /f /T >nul 2>nul
)
)

@REM DEFINE PATH TO BATCH FILES
SET batch_file_Path="C:'wamp'batch_files"
@REM Change directory to batch files
cd %batch_file_Path%
@REM #######################
@REM # LAUNCH NODE SERVERS #
@REM #######################
echo Launch Node Servers
@REM RADAR
start cmd /k launch_server.bat C:'wamp'www'radar
@REM RADAR_SCHEDULE
start cmd /k launch_server.bat C:'wamp'www'radar_schedule

@REM ######################################################################
@REM # LAUNCH NODE SERVERS WITH "NODE FILENAME.JS" INSTEAD OF "NPM START" #
@REM ######################################################################
@REM LOGIN_DATA_SERVER
start cmd /k launch_server_node.bat login_data_server.js
@REM WALLBOARD_SERVER
start cmd /k launch_server_node.bat wallboard_server.js
@REM SERVER
start cmd /k launch_server_node.bat server.js

@REM ########################
@REM # LAUNCH AVAYA REPORTS #
@REM ########################
echo Launch Avaya
@REM Launch CMS Supervisor and wait 10 seconds
"C:'Program Files (x86)'Avaya'CMS Supervisor R16'acsRun.exe" /L:enu
"C:'Program Files'AutoHotkey'AutoHotkey.exe" "''Path'To'File'cmsLogin.ahk"
timeout 10
echo Launch Avaya Reports
@REM Launch Reports
"''Path'To'File'Agent Status.acsup"
"''Path'To'File'RE - Wallboard.acsup"
"''Path'To'File'RD - Wallboard.acsup"
"''Path'To'File'WT - All Agent LoginLogout.acsup"
"''Path'To'File'WT - Agent Realtime.acsup"
timeout 2
exit

感谢您抽出宝贵时间:)

巴里

作为一种可能的解决方案,请考虑将作为 Web 应用程序运行的 PHP 与运行批处理文件的 PHP 分开,并在它们之间使用某种机制来相互通信。例如,第一个PHP可以插入一个状态为"SUBMIT-RESTART"的mysql表行,第二个PHP可以在Windows任务调度程序中每2分钟运行一次:

  • 查询 mysql 表是否存在状态为"提交-重启"状态的行
  • 如果有这样的行,请将状态更改为"正在重新启动",然后继续运行批处理命令,
  • 完成后,将状态更改为"重新启动完成"