Я запускаю веб-приложение на Windows Server 2012 и должен выполнять бесконечный цикл в файле PHP. Чтобы контролировать это, я создал два командных файла.
Файл PHP:
<?php
while(true) {
sleep(10);
}
?>
BatchFile, который вызывает файл PHP:
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, как вы можете видеть. Он пытается дать этой службе имя, чтобы он мог найти ее позже в списке задач.
Вещи, которые я пытался:
Это 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
Других решений пока нет …