Проверка запущен ли процесс. Как проверить, запущен ли процесс через пакетный пакет script

Проверка запущен ли процесс. Как проверить, запущен ли процесс через пакетный пакет script

Мне нравится WMIC и TASKLIST инструментов, но они не доступны в доме/основные издания windows.Another способа является использование QPROCESS команд доступны на почти каждое окно машины (для тех, которые имеют терминальные услуги - Я думаю, что только победа XP без SP2, так practialy каждый окна машины):

@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>

QPROCESS команда не настолько сильна, как TASKLIST и ограничивается в показе только 12 символов имени процесса, но следует принимать во внимание, если TASKLIST не доступен.

Более простое использование, где он использует имя, если процесс в качестве аргумента (суффикс.exe является обязательным в этом случае, когда вы передаете имя исполняемого файла):

@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

Разница между двумя способами QPROCESS использования что QPROCESS * перечисляет все процессы, в то время как QPROCESS some.exe будет фильтровать только процессы для текущего пользователя.

Использование WMI объектов через windows script host exe вместо WMIC также является опцией. Он также должен запускаться на всех машинах Windows (исключая те, где WSH выключен, но это редкий случай).Здесь летучая мышь файл, в котором перечислены все процессы через классы WMI и может быть использован вместо QPROCESS в сценарии выше (это JScript/летучая мышь гибрид и должны быть сохранены как.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); }

И модификация, которая будет проверять если процесс запущен:

@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); }

два варианта может быть использован на машинах, которые не имеют TASKLIST .

Конечная техника используется MSHTA . Это будет работать на всех машинах Windows с XP и выше и не зависит от настроек хоста Windows Script. вызов MSHTA может сократить немного на производительность, хотя (опять-таки должна быть сохранена в летучей мыши):

@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:" | 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();

Я пытаюсь найти, работает ли процесс на основе идентификатора процесса. Код выглядит следующим образом, основываясь на одном из сообщений на форуме. Я не могу рассматривать имя процесса, поскольку существует несколько процессов, работающих под тем же именем.

Def findProcess(processId): ps= subprocess.Popen("ps -ef | grep "+processId, shell=True, stdout=subprocess.PIPE) output = ps.stdout.read() ps.stdout.close() ps.wait() return output def isProcessRunning(processId): output = findProcess(processId) if re.search(processId, output) is None: return true else: return False 1111 72312 72311 0 0:00.00 ttys000 0:00.00 /bin/sh -c ps -ef | grep 71676 1111 72314 72312 0 0:00.00 ttys000 0:00.00 grep 71676

Он всегда возвращает true, поскольку он может найти идентификатор процесса в выходной строке.

Какие-либо предложения? Спасибо за любую помощь.

11 Solutions collect form web for “Проверьте, запущен ли процесс в Python (в Linux / Unix)”

Пытаться:

Os.kill(pid, 0)

Должен преуспеть (и ничего не делать), если процесс существует, или выбросить исключение (которое вы можете поймать), если процесс не существует.

Самый простой ответ, на мой взгляд (albiet, возможно, не идеальный), – это изменить

Ps -ef | grep

Для того, чтобы:

Ps -ef | grep | grep -v grep

Это будет игнорировать список процессов для поиска grep, содержащий PID процесса, который вы пытаетесь найти.

По-видимому, ответ пользователя9876 гораздо более «питонический».

Это немного kludge, но на * nix вы можете использовать os.getpgid (pid) или os.kill (pid, sig), чтобы проверить наличие идентификатора процесса.

Import os def is_process_running(process_id): try: os.kill(process_id, 0) return True except OSError: return False

EDIT: Обратите внимание, что os.kill работает в Windows (с Python 2.7), а os.getpgid не будет . Но версия Windows вызывает TerminateProcess () , которая «безоговорочно заставит процесс выйти», поэтому я предсказываю, что он не будет безопасно возвращать нужную вам информацию, фактически не убив процесс, если он существует.

Если вы используете Windows, сообщите нам об этом, потому что ни одно из этих решений не приемлемо в этом сценарии.

Вы можете проверить, существует ли папка / proc / .

>>> import os.path >>> os.path.exists("/proc/0") False >>> os.path.exists("/proc/12") True

См. Так: Как вы проверяете Linux с Python, если процесс все еще запущен?

Если вы не возражаете против использования внешнего модуля, я бы предложил psutil . Это кросс-платформенный и простой в использовании, чем нерестовая подоболочка только с целью поиска текущего процесса.

Если этот процесс принадлежит одному и тому же пользователю, процесс проверки, вы можете просто попытаться его kill . Если вы используете сигнал 0, kill не отправит ничего, но все же позволит вам узнать, доступен ли этот процесс.

Если sig равно 0, то сигнал не отправляется, но проверка ошибок все еще выполняется; это можно использовать для проверки наличия идентификатора процесса или идентификатора группы процессов.

Это должно соответствующим образом распространяться на методы python.

Я знаю, что это старо, но я использовал это и, похоже, работает; вы можете быстро адаптироваться к преобразованию из имени процесса в идентификатор процесса:

Try: if len(os.popen("ps -aef | grep -i "myprocess" | grep -v "grep" | awk "{ print $3 }"").read().strip().split("\n")) > 1: raise SystemExit(0) except Exception, e: raise e

В Windows другой вариант – использовать tasklist.exe:

Синтаксис: tasklist.exe / NH / FI "PID eq processID"

Def IsProcessRunning(processId): ps= subprocess.Popen(r"tasklist.exe /NH /FI "PID eq %d"" % (processId), shell=True, stdout=subprocess.PIPE) output = ps.stdout.read() ps.stdout.close() ps.wait() if processId in output: return True return False

В Windows вы можете использовать WMI.

From win32com.client import GetObject GetObject("winmgmts:").ExecQuery("Select * from Win32_Process where ProcessId = " + str(pid)).count

Вы также можете использовать другие фильтры. Например, я, скорее всего, просто хочу сказать, работает ли процесс по имени и предпринимает действия. Например, если DbgView не запущен, запустите его.

If not GetObject("winmgmts:").ExecQuery("Select * from Win32_Process where Name = "dbgview.exe"").count: subprocess.Popen(r"C:\U\dbgview.exe", shell=False)

Вы также можете перебирать и делать другие интересные вещи. Полный список полей находится здесь.

Недавно мне пришлось перечислить текущие процессы и так:

Def check_process(process): import re import subprocess returnprocess = False s = subprocess.Popen(["ps", "ax"],stdout=subprocess.PIPE) for x in s.stdout: if re.search(process, x): returnprocess = True if returnprocess == False: print "no process executing" if returnprocess == True: print "process executing"

Вы должны найти его дважды.

ps -ef | grep 71676 | sed "s/71676//" | grep 71676

Если это возвращает True то это действительно работает!

Мне нравятся инструменты WMIC и TASKLIST , но они недоступны в домашних/основных версиях окон. Другим способом является использование команды QPROCESS , доступной почти на всех машинах Windows (для тех, которые имеют терминальные службы - Я думаю, что только выиграть XP без SP2, так что практически каждый компьютер Windows):

@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>

QPROCESS команда не так сильна, как TASKLIST и ограничена отображением всего 12 символов имя процесса, но следует учитывать, если TASKLIST недоступно.

Более простое использование, когда оно использует имя, если процесс как аргумент (суффикс.exe является обязательным в этом случае, когда вы передаете исполняемое имя):

@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

Различие между двумя способами использования QPROCESS заключается в том, что QPROCESS * отобразит все процессы, а QPROCESS some.exe будет фильтровать только процессы для текущего пользователя.

Использование WMI объектов через окна script host exe вместо WMIC также является опцией. Он должен также запускаться на всех машинах Windows (исключая те, где WSH выключен, но это редкий случай). Вот файл bat, который перечисляет все процессы через классы WMI и может использоваться вместо QPROCESS в script выше (это гибрид jscript/bat и должен быть сохранен как.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); }

И модификация, которая будет проверять, запущен ли процесс:

@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); }

Эти два параметра можно использовать на машинах без TASKLIST .

Конечная техника использует MSHTA . Это будет работать на всех машинах Windows с XP и выше и не зависит от настроек Windows script. вызов MSHTA может немного снизить производительность (опять же нужно сохранить как 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:" | 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();