Как назначить имя процесса пакетному файлу при запуске из планировщика задач

Я запускаю веб-приложение на 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, как вы можете видеть. Он пытается дать этой службе имя, чтобы потом найти ее в списке задач.

Что я пробовал:

  1. Запустите batfile2 из командной строки и проверьте, могу ли я найти строку «WatchdogStarterBATCH» в списке задач. Я смог найти его, так что это работает.
  2. Попробуйте назначить имя в команде «Пуск», которую я использовал, но это не помогло.
  3. Попробуйте присвоить имя в первом пакетном файле с помощью «TITLE», но это не помогло.

person Willem van Oort    schedule 11.01.2016    source источник
comment
Настроена ли задача для запуска только тогда, когда пользователь вошел в систему?   -  person Squashman    schedule 11.01.2016
comment
Нет, я настроил его для запуска независимо от того, вошел ли пользователь в систему или нет, а также для запуска с наивысшими привилегиями.   -  person Willem van Oort    schedule 12.01.2016


Ответы (1)


Это вбс.

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 
person Community    schedule 11.01.2016
comment
я могу проверить наличие cmd.exe, но поскольку могут быть и другие экземпляры cmd.exe, я хочу дать процессу имя, а затем проверить это имя. - person Willem van Oort; 13.01.2016
comment
То, как вы хотите, и как вы можете решить свою проблему — две разные вещи. - person ; 13.01.2016
comment
Я знаю, но я не могу решить свою проблему, ища «cmd.exe», потому что может быть запущено несколько экземпляров «cmd.exe». Вот почему мне нужно идентифицировать этот экземпляр чем-то другим, например, именем процесса. Я открыт для других решений, конечно. - person Willem van Oort; 13.01.2016
comment
Вот что делает мой ответ: найдите PHP.exe и файл с вашим php-файлом. CMD не запускает ваш файл, это делает PHP. - person ; 13.01.2016
comment
хорошо, но как я узнаю, что это экземпляр PHP.exe, который запускает мой конкретный файл, потому что также может быть несколько экземпляров PHP.exe. Я никогда не использовал VBS, поэтому я мог что-то упустить. - person Willem van Oort; 13.01.2016
comment
Вторая половина моего ответа посвящена этому. Сделайте instr в вашей командной строке, ищите YourFile.php. Сохраните PID и установите ProcessStop и проверьте, выходит ли этот PID. - person ; 13.01.2016