首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过PHP执行的批处理文件将所有命令作为后台进程运行

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

Stack Overflow用户
提问于 2016-07-12 21:54:13
回答 1查看 502关注 0票数 3

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

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

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

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

当我双击批处理文件时,或者如果我通过Task Scheduler运行它,这一切都运行得很好,但是我们现在希望能够通过单击PHP页面上的按钮来运行它。

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

从我看到的情况来看,当我单击按钮时,批处理文件运行,关闭所有节点服务器,这就是它,至少我一开始是这么认为的。

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

AFAIK当从PHP执行批处理文件时,没有办法让它打开cmd,但是我认为批处理文件本身会在前台运行cmd窗口和avaya。

有没有办法做到这一点?

下面的代码,以防需要。

PHP

代码语言:javascript
复制
$test = escapeshellcmd('C:\Windows\System32\cmd.exe /k 
"C:\wamp\www\batch_files\R - Wallboards Script"');
system($test);

批处理文件

代码语言:javascript
复制
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

感谢您的宝贵时间:)

巴里

EN

回答 1

Stack Overflow用户

发布于 2016-07-14 23:22:31

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

  • 查询mysql表中是否有状态为

-

  • 的行,如果有,则将状态改为
  • ,并继续运行批处理命令,
  • 完成后,将状态改为'RESTART-DONE'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38330927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档