簡體   English   中英

通過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 windows和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表是否存在具有“SUBMIT-RESTART”狀態的行
  • 如果有這樣的行,將狀態更改為“RESTARTING”,然后繼續運行批處理命令,
  • 完成后,將狀態更改為“RESTART-DONE”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM