I like the WMIC
and TASKLIST
tools but they are not available in home/basic editions of windows.Another way is to use QPROCESS
command available on almost every windows machine (for the ones that have terminal services — I think only win XP without SP2 , so practialy every windows machine):
@echo off
:check_process
setlocal
if "%~1" equ "" echo pass the process name as forst argument && exit /b 1
:: first argument is the process you want to check if running
set process_to_check=%~1
:: QPROCESS can display only the first 12 symbols of the running process
:: If other tool is used the line bellow could be deleted
set process_to_check=%process_to_check:~0,12%
QPROCESS * | find /i "%process_to_check%" >nul 2>&1 && (
echo process %process_to_check% is running
) || (
echo process %process_to_check% is not running
)
endlocal
QPROCESS
command is not so powerful as TASKLIST
and is limited in showing only 12 symbols of process name but should be taken into consideration if TASKLIST
is not available.
More simple usage where it uses the name if the process as an argument (the .exe
suffix is mandatory in this case where you pass the executable name):
@echo off
:check_process
setlocal
if "%~1" equ "" echo pass the process name as forst argument && exit /b 1
:: first argument is the process you want to check if running
:: .exe suffix is mandatory
set "process_to_check=%~1"
QPROCESS "%process_to_check%" >nul 2>&1 && (
echo process %process_to_check% is running
) || (
echo process %process_to_check% is not running
)
endlocal
The difference between two ways of QPROCESS
usage is that the QPROCESS *
will list all processes while QPROCESS some.exe
will filter only the processes for the current user.
Using WMI
objects through windows script host exe instead of WMIC
is also an option.It should on run also on every windows machine (excluding the ones where the WSH is turned off but this is a rare case).Here bat file that lists all processes through WMI classes and can be used instead of QPROCESS
in the script above (it is a jscript/bat hybrid and should be saved as .bat
):
@if (@X)==(@Y) @end /* JSCRIPT COMMENT **
@echo off
cscript //E:JScript //nologo "%~f0"
exit /b
************** end of JSCRIPT COMMENT **/
var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2");
var colProcess = winmgmts.ExecQuery("Select * from Win32_Process");
var processes = new Enumerator(colProcess);
for (;!processes.atEnd();processes.moveNext()) {
var process=processes.item();
WScript.Echo( process.processID + " " + process.Name );
}
And a modification that will check if a process is running:
@if (@X)==(@Y) @end /* JSCRIPT COMMENT **
@echo off
if "%~1" equ "" echo pass the process name as forst argument && exit /b 1
:: first argument is the process you want to check if running
set process_to_check=%~1
cscript //E:JScript //nologo "%~f0" | find /i "%process_to_check%" >nul 2>&1 && (
echo process %process_to_check% is running
) || (
echo process %process_to_check% is not running
)
exit /b
************** end of JSCRIPT COMMENT **/
var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2");
var colProcess = winmgmts.ExecQuery("Select * from Win32_Process");
var processes = new Enumerator(colProcess);
for (;!processes.atEnd();processes.moveNext()) {
var process=processes.item();
WScript.Echo( process.processID + " " + process.Name );
}
The two options could be used on machines that have no TASKLIST
.
The ultimate technique is using MSHTA
. This will run on every windows machine from XP and above and does not depend on windows script host settings. the call of MSHTA
could reduce a little bit the performance though (again should be saved as bat):
@if (@X)==(@Y) @end /* JSCRIPT COMMENT **
@echo off
setlocal
if "%~1" equ "" echo pass the process name as forst argument && exit /b 1
:: first argument is the process you want to check if running
set process_to_check=%~1
mshta "about:<script language='javascript' src='file://%~dpnxf0'></script>" | find /i "%process_to_check%" >nul 2>&1 && (
echo process %process_to_check% is running
) || (
echo process %process_to_check% is not running
)
endlocal
exit /b
************** end of JSCRIPT COMMENT **/
var fso= new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1);
var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2");
var colProcess = winmgmts.ExecQuery("Select * from Win32_Process");
var processes = new Enumerator(colProcess);
for (;!processes.atEnd();processes.moveNext()) {
var process=processes.item();
fso.Write( process.processID + " " + process.Name + "\n");
}
close();
5 / 5 / 0 Регистрация: 17.11.2013 Сообщений: 246 |
|
1 |
|
Проверять, запущен ли процесс, а если он не запущен, то запускать его24.08.2015, 00:59. Показов 37425. Ответов 18
Всех приветствую. В интернете не нашёл ответа на свой вопрос. 1. Проверка процесса должна происходить раз в 15 минут. Код "RustDedicated.exe" -batchmode -Dfile.encoding=UTF-8 +server.hostname "LocalServer.Pro" +server.port 28015 +server.identity "d4t1" +server.maxplayers 30 +rcon.port 28016 +rcon.ip 192.168.1.2 +rcon.password 11112 +server.seed 123456 — Это сейчас прописано в батнике…батник не справляется с перезапуском как нужно. Буду крайне благодарен тому, кто разбирается в Visual Basic Script’ах и поможет мне.
0 |
raxp 10229 / 6607 / 498 Регистрация: 28.12.2010 Сообщений: 21,156 Записей в блоге: 1 |
||||||||
24.08.2015, 10:10 |
2 |
|||||||
батник не справляется с перезапуском как нужно. разобраться со своим прежде, чем делать выводы никак? Где ваш батник? Впрочем, не нужен. Приведу элементарный вариант на примере калькулятора:
Сохраняем в ‘proc.bat’. Для скрытого запуска батника пишем VBS-скрипт:
Сохраняем в ‘run.vbs’. Запускаем его.
2 |
18068 / 7671 / 891 Регистрация: 25.12.2011 Сообщений: 11,444 Записей в блоге: 17 |
|
24.08.2015, 16:02 |
3 |
А в диспетчере задач он есть? ( RustDedicated.exe )
1 |
Vasek2 5 / 5 / 0 Регистрация: 17.11.2013 Сообщений: 246 |
||||
24.08.2015, 17:11 [ТС] |
4 |
|||
разобраться со своим прежде, чем делать выводы никак? Где ваш батник? Мой батник:
game.exe есть тот самый процесс. Добавлено через 19 секунд
А в диспетчере задач он есть? ( RustDedicated.exe ) Конечно есть))
0 |
Dragokas 18068 / 7671 / 891 Регистрация: 25.12.2011 Сообщений: 11,444 Записей в блоге: 17 |
||||
24.08.2015, 17:22 |
5 |
|||
Конечно есть)) Для серверных игр запуск часто происходит через лаунчер, который является только промежуточным процессом.
Мой батник: Пришлите в виде файла.
Команду tasklist ввести в консоль и проверить, работает ли вывод списка процессов вообще (может, у Вас служба WMI отключена). Добавлено через 3 минуты
батник не справляется с перезапуском как нужно.
Конечно есть)) Так все-таки процессы разные? Почему у Вас в батнике game.exe, а в 1-м посту RustDedicated.exe?
1 |
5 / 5 / 0 Регистрация: 17.11.2013 Сообщений: 246 |
|
24.08.2015, 17:27 [ТС] |
6 |
(может, у Вас служба WMI отключена) WMI включена (это же Служба Инструментов Windows?). Добавлено через 4 минуты
Так все-таки процессы разные? Почему у Вас в батнике game.exe, а в 1-м посту RustDedicated.exe? Я прислал шаблон, который мне на другом форуме составили. И вместо game.exe я подставлял RustDedicated.exe уже на своём компьютере. И параметры я тоже подставлял. Код "Setting breakpad minidump AppID = 252490" Естественно такой «номер» меня не устраивает, т.к. я должен ведь следить, что происходит в консоли.
0 |
10229 / 6607 / 498 Регистрация: 28.12.2010 Сообщений: 21,156 Записей в блоге: 1 |
|
24.08.2015, 17:34 |
7 |
tasklist — системная утилита и от WMI не зависит (список процессов не идет через моникер winmgmts).
0 |
5 / 5 / 0 Регистрация: 17.11.2013 Сообщений: 246 |
|
24.08.2015, 17:42 [ТС] |
8 |
В общем тему заминаем. Нашёл человека, который платно напишет VBS-скрипт проверки процесса.
0 |
10229 / 6607 / 498 Регистрация: 28.12.2010 Сообщений: 21,156 Записей в блоге: 1 |
|
24.08.2015, 17:44 |
9 |
…госпидя, да в любом VBS-справочнике есть получение списка процессов (работа VBS скрипта в этом случае будет зависеть от WMI). Но хозяин-барин, капса только поменьше. Это к крику приравнивается, а на форуме спокойная обстановка.
1 |
Dragokas 18068 / 7671 / 891 Регистрация: 25.12.2011 Сообщений: 11,444 Записей в блоге: 17 |
||||
24.08.2015, 18:08 |
10 |
|||
raxp, зависит.
Добавлено через 6 минут
В общем тему заминаем. Нашёл человека, который платно напишет VBS-скрипт проверки процесса. Если что на будущее: VBScript — это в другом разделе форума.
Батник запускает процесс cmd правильно, но в консоли не отображается НИЧЕГО, кроме надписи: А что там должно отображаться?
1 |
10229 / 6607 / 498 Регистрация: 28.12.2010 Сообщений: 21,156 Записей в блоге: 1 |
|
24.08.2015, 18:09 |
11 |
…интересно, после дисейбла в конфигураторе перестал. Будем знать, спасибо
0 |
5 / 5 / 0 Регистрация: 17.11.2013 Сообщений: 246 |
|
24.08.2015, 20:27 [ТС] |
12 |
Если речь о консоле cmd — то там вообще ничего не должно отображаться. Так вот именно, почему там ничего не должно отображаться?) Как я буду следит за консолью то?
0 |
10229 / 6607 / 498 Регистрация: 28.12.2010 Сообщений: 21,156 Записей в блоге: 1 |
|
24.08.2015, 21:08 |
13 |
Для VBS есть Wscript, который в окно консоли ничего не пишет. Есть другой сервер сценариев — Cscript. Впрочем, вам же платно напишут, смысла обсуждать уже нет.
0 |
18068 / 7671 / 891 Регистрация: 25.12.2011 Сообщений: 11,444 Записей в блоге: 17 |
|
24.08.2015, 21:31 |
14 |
Так вот именно, почему там ничего не должно отображаться?) Как я буду следит за консолью то? Вопрос изначально стоял в том, что
батник не справляется с перезапуском как нужно. а не в том, что консоль не отображает ход своей работы. Добавлено через 1 минуту
1 |
5 / 5 / 0 Регистрация: 17.11.2013 Сообщений: 246 |
|
25.08.2015, 15:14 [ТС] |
15 |
Если автор не против, перенесу тему в раздел Batch. Пока не нужно. Батник не работает как нужно. полностью командой с сайта, чтобы этот сервер обновить до актуальной версии. Добавлено через 17 часов 32 минуты
0 |
18068 / 7671 / 891 Регистрация: 25.12.2011 Сообщений: 11,444 Записей в блоге: 17 |
|
25.08.2015, 17:49 |
16 |
Это все лишнее.
Тему можно закрывать. Скрипт написан. Зачем так кричать. Оставьте красный цвет для администрации. Темы у нас не закрываются. Читайте правила форума.
0 |
10229 / 6607 / 498 Регистрация: 28.12.2010 Сообщений: 21,156 Записей в блоге: 1 |
|
25.08.2015, 17:51 |
17 |
Мы заметили, что если с сайта слать команду, то сервер то выключается… но батник не стартует его через нужное количество времени. какие-то сферические выводы без разбора причин происходящего. Оставьте красный цвет для администрации. поправь ему, красный уже перебор.
0 |
5 / 5 / 0 Регистрация: 17.11.2013 Сообщений: 246 |
|
25.08.2015, 18:00 [ТС] |
18 |
Вот зачем нудятиной заниматься? Проблема решена. Спасибо всем, кто пытался помочь.
0 |
4332 / 2122 / 661 Регистрация: 26.04.2015 Сообщений: 6,823 |
|
28.08.2015, 17:08 |
19 |
Vasek2, Не, ну со своим кипятильником, нашу воду кипятить, пришли за водой, так и отлейте другим немножко.
0 |
Бывают задачи, когда в командном CMD/BAT файле необходимо узнать, запущено ли какое-то определённое приложение.
Например, командный файл резервного копирования должен дождаться завершения программы, открывшей файлы. Или командный файл должен проверять работу программы и, если она не запущена, запускать её.
Для решения этих задач надо лишь воспользоваться командой tasklist с фильтром по названию приложения.
Проверить, запущено ли приложение Microsoft Outlook (outlook.exe):
@echo off set imagename=outlook.exe tasklist /fi "IMAGENAME eq %imagename%" | find /i "%imagename%" if errorlevel 1 ( echo %imagename% не запущен rem Выполняем действия, требуемые при закрытом Outlook ) else ( echo %imagename% запущен rem Выполняем действия, требуемые при открытом Outlook )
Другая задача – дождаться запуска программы, чтобы выполнить какие-то действия:
@echo off set imagename=outlook.exe :CheckProgram tasklist /fi "IMAGENAME eq %imagename%" | find /i "%imagename%" if errorlevel 1 cscript.exe sleep.js 1000 && goto CheckProgram rem Выполняем действия, требуемые при открытом Outlook
Здесь используется скрипт sleep.js, делающий задержку на 1 секунду (1000 мс), см. Как сделать задержку в командном файле.
Аналогично, дождаться завершения программы, чтобы выполнить какие-то действия:
@echo off set imagename=outlook.exe :CheckProgram tasklist /fi "IMAGENAME eq %imagename%" | find /i "%imagename%" if not errorlevel 1 cscript.exe sleep.js 1000 && goto CheckProgram rem Выполняем действия, требуемые при закрытом Outlook
Как проверить запущен ли процесс?
При работе с программами и приложениями, иногда возникает необходимость проверить, запущен ли определенный процесс на компьютере. Это может быть полезно, например, при автоматизации работы или при создании скриптов. В этой статье мы рассмотрим различные способы проверки запущенных процессов в разных операционных системах.
В операционной системе Windows можно использовать команду tasklist для получения списка всех запущенных процессов. Эта команда позволяет получить информацию о имени процесса, его PID (идентификатор процесса), использование памяти и другие свойства. Для проверки запущен ли определенный процесс, мы можем выполнить эту команду в командной строке и затем проанализировать вывод. Например, чтобы проверить, запущен ли процесс с именем ‘notepad.exe’, мы можем выполнить следующую команду:
tasklist | findstr /i "notepad.exe"
Вывод этой команды будет содержать строки с именем процесса ‘notepad.exe’, если он запущен, или быть пустым, если процесс не найден.
В системах на базе Linux можно использовать команду ps для получения информации о процессах. Аналогично команде tasklist, команда ps позволяет получить список запущенных процессов со всеми необходимыми свойствами. Для проверки запущен ли определенный процесс, мы можем выполнить команду ps и затем проанализировать вывод с использованием утилиты grep. Например, чтобы проверить, запущен ли процесс с именем ‘firefox’, мы можем выполнить следующую команду:
ps aux | grep "firefox"
Вывод этой команды будет содержать строки с именем процесса ‘firefox’, если он запущен, или быть пустым, если процесс не найден.
Если вы пишете программу на языке программирования, таком как Python или Java, вы можете использовать соответствующие библиотеки для выполнения проверки запущенных процессов. Например, в Python вы можете использовать модуль psutil, который предоставляет широкие возможности по работе с процессами. С помощью этого модуля вы можете получить информацию о всех процессах, и искать среди них нужный. Ниже приведен пример кода на Python, который проверяет, запущен ли процесс с именем ‘notepad.exe’:
import psutil for process in psutil.process_iter(['pid', 'name']): if process.info['name'] == 'notepad.exe': print('Процесс notepad.exe найден') break else: print('Процесс notepad.exe не найден')
В данном примере мы используем метод process_iter модуля psutil, чтобы получить информацию о всех процессах. Затем мы проверяем имя каждого процесса и, если имя совпадает с именем ‘notepad.exe’, выводим сообщение о нахождении процесса. Если процесс не найден, выводим соответствующее сообщение.
Таким образом, есть несколько подходов к проверке запущенных процессов. Вы можете использовать команды системы, такие как tasklist или ps, или использовать соответствующие библиотеки в своей программе. Выберите подход, который наиболее удобен и подходит для вашей ситуации.
Рассмотрим, как с помощью PowerShell проверить, запущено ли определенное приложение или процесс, как автоматически перезапустить его при сбое, если его случайно закрыл пользователь или он стал утекать (использовать слишком много оперативной памяти).
Ранее мы показывали, как с помощью PowerShell можно управлять процессами Windows. Чтобы проверить, запущен ли процесс notepad.exe и перезапустить его, можно использовать такой скрипт.
If (!(Get-Process -Name notepad -ErrorAction SilentlyContinue))
{Invoke-Item C:\Windows\notepad.exe
}
Можно автоматически перезапустить процесс, если он не отвечает (завис) или если он стал использовать слишком много оперативной памяти (в этом примере более 500 Мб):
$proc = Get-Process -Name notepad| Sort-Object -Property ProcessName -Unique
If (($proc.Responding -eq $false) –or ($proc.WorkingSet -GT 500000*1024)) {
$proc.Kill()
Start-Sleep -s 10
Invoke-Item C:\Windows\notepad.exe
}
С помощью for можно сделать бесконечный цикл, который запускает процесс, каждые 60 секунд проверяет что он запущен и перезапускает его, если нужно:
for(;;)
{
try
{
If (!(Get-Process -Name notepad -ErrorAction SilentlyContinue))
{Invoke-Item C:\Windows\notepad.exe
}
$proc = Get-Process -Name notepad | Sort-Object -Property ProcessName -Unique -ErrorAction SilentlyContinue
If (!$proc -or ($proc.Responding -eq $false) –or ($proc.WorkingSet -GT 200000*1024)) {
$proc.Kill()
Start-Sleep -s 10
Invoke-Item C:\Windows\notepad.exe
}
}
catch
{
}
Start-sleep -s 60
}
Если нужно проверить состояние процесса на удаленных компьютерах, можно использовать команду:
$proc = Get-Process -ComputerName PC01 -Name notepad | Sort-Object -Property ProcessName -Unique -ErrorAction SilentlyContinue
Для удаленного запуска процесса можно использовать Invoke-Command:
Invoke-Command -ComputerName PC01 -Credential $Cred -ScriptBlock {Start-Process C:\Windows\notepad.exe -wait -verb runas;}
Вы можете запустить этот PowerShell скрипт в виде логон скрипта GPO при входе пользователя.
В этом случае нужно сохранить PowerShell код в файле с расширением PS1. Можно подписать этот скрипт цифровой подписью, изменить настройки политики запуска PowerShell скриптов, или запускать его с параметром
–ExecutionPolicy Bypass
.
- Имя запускаемого файла:
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe
- Параметры запуска:
-windowstyle hidden -ExecutionPolicy Bypass –Noprofile -file %~dp0CheckProcess.ps1
Также можно запускать PS1 скрипт по расписанию с помощью задания планировщика. Используйте аналогичные параметры запуска. Дополнительно можно указать учетную запись пользователя, от имени которого запускать процесс.
$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-windowstyle hidden -ExecutionPolicy Bypass -file %windir%\CheckProcess.ps1"
$Trigger= New-ScheduledTaskTrigger -AtLogon
$Principal=New-ScheduledTaskPrincipal -UserId "aaivanov" -LogonType Interactive
$Task=New-ScheduledTask -Action $Action -Trigger $Trigger -Principal $Principal
Register-ScheduledTask -TaskName "Check Notepad Process" -InputObject $Task
Либо этот PowerShell скрипт можно запускать в виде службы Windows
Если в запущенном приложении не требуется взаимодействие с пользователем, лучше всего запускать его в виде службы. В дальнейшем вы можете управлять этой службой через стандартную консоль services.msc или через PowerShell. В Windows есть встроенный функционал перезапуска служб либо вы можете перезапускать зависшую службу так.