0

我在 Windows Server 2012 上运行一个 web 应用程序,并且必须在 PHP 文件中运行一个无限循环。为了控制这一点,我创建了两个批处理文件。

PHP 文件:

<?php 
    while(true) { 
        sleep(10); 
    } 
?>

调用 PHP 文件的 BatchFile:

TITLE WatchdogStarterBATCH

php "%~dp0watchdog.php"
timeout 5

批处理文件 2

@ECHO OFF

:: Detect whether program is running
for /f "tokens=2 delims=," %%P in ('tasklist /v /fo csv ^| findstr /i "WatchdogStarterBATCH"') do set pid=%%~P

IF [%pid%] == [] (
:: Program not running, trying to restart
start "WatchdogStarterBATCH" "%~dp0WatchdogStarter.bat"
timeout 5
GOTO rerun
) ELSE (
:: Program is running
GOTO end
)

:rerun
:: Check whether program is running now
for /f "tokens=2 delims=," %%P in ('tasklist /v /fo csv ^| findstr /i "WatchdogStarterBATCH"') do set pid=%%~P

IF [%pid%] == [] (
:: Restart failed, log to database
php "%~dp0WatchdogErrorLogger.php"
) ELSE (
:: Restart successful, log to database
php "%~dp0WatchdogWarningLogger.php"
GOTO end
)

:end
echo Done.
timeout 5

批处理文件 2 由任务计划程序调用,然后调用 WatchdogStarter.bat,如您所见。它尝试为该服务命名,以便稍后在任务列表中找到它。

我尝试过的事情:

  1. 从命令行运行 batfile2 并检查我是否可以在任务列表中找到字符串“WatchdogStarterBATCH”。我能够找到它,所以它有效。
  2. 尝试在我使用的“开始”命令中指定一个名称,但这没有帮助。
  3. 尝试在第一个批处理文件中使用“TITLE”指定一个名称,但这没有帮助。
4

1 回答 1

0

这是vbs。

Set WshShell = WScript.CreateObject("WScript.Shell")
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2") 
Set objEvents = objWMIService.ExecNotificationQuery _
    ("SELECT * FROM Win32_ProcessStopTrace")

Do
    Set objReceivedEvent = objEvents.NextEvent
    msgbox objReceivedEvent.ProcessName
    If lcase(objReceivedEvent.ProcessName) = lcase("Notepad.exe") then 
        Msgbox "Process exited with exit code " & objReceivedEvent.ExitStatus
        WshShell.Run "c:\Windows\notepad.exe", 1, false
    End If
Loop

它的作用是等待程序退出(所有程序)以及记事本(在示例中)是否重新启动它。您将检查 php.exe 或任何它的名称。

或使用以下命令获取命令行并通过 PID 检查。

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")

Set colItems = objWMIService.ExecQuery("Select * From Win32_Process")

For Each objItem in colItems
    msgbox objItem.ProcessID & " " & objItem.CommandLine
Next 

使用 Instr 在命令行中检查您的 PHP 文件名并存储 PID。

这也可以

Set WshShell = WScript.CreateObject("WScript.Shell")
Do
    Return = WshShell.Run("notepad " & WScript.ScriptFullName, 0, true)
Loop

它启动记事本并等待它退出,然后永远重新启动它。

批量相同的技术

:ALabel
start "" /w notepad.exe
Goto ALabel 
于 2016-01-11T20:49:02.587 回答