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

标签 php node.js windows batch-file cmd

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

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

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

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

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

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

据我所知,当我单击该按钮时,批处理文件运行,关闭所有 Node 服务器,一开始我是这么想的。

通过一些挖掘我发现它实际上正在执行整个批处理文件,但是它运行所有 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 可以每 2 分钟在 Windows 任务调度程序中运行一次:

  • 查询mysql表是否有'SUBMIT-RESTART'状态的行
  • 如果有这样一行,将状态更改为'RESTARTING',然后继续运行批处理命令,
  • 完成后,将状态更改为“RESTART-DONE”

关于php - 通过 PHP 执行的批处理文件将所有命令作为后台进程运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38330927/

相关文章:

windows - 保护可移植 Intranet 上的通信(更改 IP 地址)

PHP 错误 : Uncaught TypeError: Cannot access offset of type string on string

php - 将按钮值提交给 Controller 但未能发布该值

javascript - 将两个数组(键和值)合并到一个对象中

windows - 文件重命名批处理脚本的启用延迟扩展问题

python-3.x - 在 Google 表格或 Python 中的 Excel 中截取范围的屏幕截图?

php - mysql 数据库插入正在将所有 ID 更改为 4294967295

php多维数组,存在则查找更新,不存在则插入

node.js - Flow 和 webpack 别名

javascript - Restful服务需要用户名和密码才能获取 token ,是否可以将凭据(用户和通行证)保存在服务器端nodejs中?