0

Windows Server 2012 で Web アプリケーションを実行していますが、PHP ファイルで無限ループを実行する必要があります。これを制御するために、2 つのバッチ ファイルを作成しました。

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 に答える