Проверка дали процесът работи. Как да проверите дали даден процес се изпълнява чрез пакетен скрипт

Проверка дали процесът работи. Как да проверите дали даден процес се изпълнява чрез пакетен скрипт

Харесвам инструментите WMIC и TASKLIST, но те не са налични в home/main изданията на windows. Друг начин е да използвате командите QPROCESS, налични на почти всяка windows машина (за тези, които имат терминални услуги - мисля, че само win XP без SP2 , така че на практика всяка машина за прозорци):

@echo off:check_process setlocal if "%~1" equ "" echo предаване на името на процеса като forst аргумент && exit /b 1:: първият аргумент е процесът, който искате да проверите дали се изпълнява set process_to_check=%~1:: QPROCESS може да показва само първите 12 символа на изпълнявания процес:: Ако се използва друг инструмент, редът по-долу може да бъде изтрит set process_to_check=%process_to_check:~0.12% QPROCESS * | намери /i "%process_to_check%" >nul 2>

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

По-проста употреба, при която използва името if процес като аргумент (наставката .exe е задължителна в този случай, когато предавате името на изпълнимия файл):

@echo off:check_process setlocal if "%~1" equ "" echo предава името на процеса като аргумент forst && exit /b 1:: първият аргумент е процесът, който искате да проверите дали работи:: .exe суфиксът е задължителен set " process_to_check=%~1" QPROCESS "%process_to_check%" >nul 2>&1 && (ехо процес %process_to_check% се изпълнява) || (ехо процес %process_to_check% не се изпълнява) endlocal

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

Използването на WMI обекти чрез Windows script host exe вместо WMIC също е опция. Също така трябва да работи на всички Windows машини(с изключение на тези, при които WSH е деактивиран, но това е рядък случай). Ето bat файл, който изброява всички процеси чрез WMI класове и може да се използва вместо QPROCESS в скрипта по-горе (това е JScript/BAT хибрид и трябва да бъде записан като .bat):

@if (@X)==(@Y) @end /* JSCRIPT КОМЕНТАР ** @echo off cscript //E:JScript //nologo "%~f0" изход /b ********** **** край на JSCRIPT КОМЕНТАР **/ var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2"); var colProcess = winmgmts.ExecQuery("Изберете * от Win32_Process"); var процеси = нов изброител(colProcess); за (;!processes.atEnd();processes.moveNext()) ( var process=processes.item(); WScript.Echo(process.processID + " " + process.Name); )

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

@if (@X)==(@Y) @end /* JSCRIPT КОМЕНТАР ** @echo off if "%~1" equ "" echo предава името на процеса като аргумент forst && exit /b 1:: първият аргумент е процесът, който искате да проверите дали се изпълнява set process_to_check=%~1 cscript //E:JScript //nologo "%~f0" | find /i "%process_to_check%" >nul 2>&1 && (ехо процес %process_to_check% се изпълнява) || (ехо процес %process_to_check% не се изпълнява) изход /b ************** край на JSCRIPT КОМЕНТАР **/ var winmgmts = GetObject("winmgmts:\\\\.\\root \\cimv2"); var colProcess = winmgmts.ExecQuery("Изберете * от Win32_Process"); var процеси = нов изброител(colProcess); за (;!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 КОМЕНТАР ** @echo off setlocal if "%~1" equ "" echo предава името на процеса като аргумент forst && exit /b 1:: първи аргумент е процесът, който искате да проверите, ако се изпълнява set process_to_check=%~1 mshta "about:" | find /i "%process_to_check%" >nul 2>&1 && (ехо процес %process_to_check% се изпълнява) || (ехо процес %process_to_check% не се изпълнява) endlocal изход /b ************** край на JSCRIPT КОМЕНТАР **/ var fso= нов ActiveXObject("Scripting.FileSystemObject").GetStandardStream( 1); var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2"); var colProcess = winmgmts.ExecQuery("Изберете * от Win32_Process"); var процеси = нов изброител(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 Решения събира формуляр уеб за „Проверете дали даден процес се изпълнява в Python (на Linux/Unix)“

Опитвам:

os.kill(pid, 0)

Трябва да успее (и да не направи нищо), ако процесът съществува, или да хвърли изключение (което можете да хванете), ако процесът не съществува.

Най-простият отговор според мен (макар и не идеален) е да се промени

Ps -ef | grep

За да:

Ps -ef | grep | grep -v grep

Това ще игнорира списъка за търсене на grep с процеси, съдържащ PID на процеса, който се опитвате да намерите.

Очевидно отговорът на user9876 е много по-"Pythonic".

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

Импортиране на os def is_process_running(process_id): try: os.kill(process_id, 0) return True освен OSError: return False

РЕДАКТИРАНЕ: Моля, обърнете внимание, че 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 . Той е междуплатформен и по-лесен за използване от създаването на подобвивка само с цел намиране на текущия процес.

Ако този процес е собственост на същия потребител, проверете процеса, можете просто да опитате да го убиете. Ако използвате сигнал 0, kill няма да изпрати нищо, но все пак ще ви уведоми дали процесът е наличен.

Ако sig е 0, тогава не се изпраща сигнал, но проверката за грешки все още се извършва; това може да се използва за проверка за наличие на идентификатор на процес или идентификатор на група процеси.

Това трябва да се разпространява по подходящ начин към методите на python.

Знам, че това е старо, но съм го използвал и изглежда работи; можете бързо да се адаптирате към преобразуване от име на процес към идентификатор на процес:

Опитайте: if len(os.popen("ps -aef | grep -i "myprocess" | grep -v "grep" | awk "( print $3 )"").read().strip().split("\ n")) > 1: повдига SystemExit(0) с изключение на Exception, e: повдига 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.

От win32com.client импортирайте GetObject GetObject("winmgmts:").ExecQuery("Изберете * от Win32_Process, където ProcessId = " + str(pid)).count

Можете да използвате и други филтри. Например, най-вероятно просто искам да разбера дали даден процес работи по име и да предприема действие. Например, ако DbgView не работи, стартирайте го.

Ако не 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) за x в s.stdout: if re.search(process, x ): returnprocess = True if returnprocess == False: отпечатайте "няма процес, който се изпълнява", ако returnprocess == True: отпечатайте "процес, който се изпълнява"

Трябва да го намерите два пъти.

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

Ако върне True, значи наистина работи!

Харесвам инструментите WMIC и TASKLIST, но те не са налични в home/master версиите на Windows. Друг начин е да използвате командата QPROCESS, достъпна на почти всички машини с Windows (за тези, които имат терминални услуги - мисля, че само win XP без SP2, така че на практика всяка Компютър с Windows):

@echo off:check_process setlocal if "%~1" equ "" echo предаване на името на процеса като forst аргумент && exit /b 1:: първият аргумент е процесът, който искате да проверите дали се изпълнява set process_to_check=%~1:: QPROCESS може да показва само първите 12 символа на изпълнявания процес:: Ако се използва друг инструмент, редът по-долу може да бъде изтрит set process_to_check=%process_to_check:~0.12% QPROCESS * | намери /i "%process_to_check%" >nul 2>

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

По-лесно използване е, когато използва името на процеса if като аргумент (суфиксът .exe е задължителен в този случай, когато предавате името на изпълнимия файл):

@echo off:check_process setlocal if "%~1" equ "" echo предава името на процеса като аргумент forst && exit /b 1:: първият аргумент е процесът, който искате да проверите дали работи:: .exe суфиксът е задължителен set " process_to_check=%~1" QPROCESS "%process_to_check%" >nul 2>&1 && (ехо процес %process_to_check% се изпълнява) || (ехо процес %process_to_check% не се изпълнява) endlocal

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

Използването на WMI обекти чрез Windows script host exe вместо WMIC също е опция. Трябва също така да работи на всички машини с Windows (с изключение на тези с деактивиран WSH, но това е рядко). Ето bat файл, който изброява всички процеси чрез WMI класове и може да се използва вместо QPROCESS в скрипта по-горе (това е jscript/bat хибрид и трябва да бъде записан като .bat):

@if (@X)==(@Y) @end /* JSCRIPT КОМЕНТАР ** @echo off cscript //E:JScript //nologo "%~f0" изход /b ********** **** край на JSCRIPT КОМЕНТАР **/ var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2"); var colProcess = winmgmts.ExecQuery("Изберете * от Win32_Process"); var процеси = нов изброител(colProcess); за (;!processes.atEnd();processes.moveNext()) ( var process=processes.item(); WScript.Echo(process.processID + " " + process.Name); )

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

@if (@X)==(@Y) @end /* JSCRIPT КОМЕНТАР ** @echo off if "%~1" equ "" echo предава името на процеса като аргумент forst && exit /b 1:: първият аргумент е процесът, който искате да проверите дали се изпълнява set process_to_check=%~1 cscript //E:JScript //nologo "%~f0" | find /i "%process_to_check%" >nul 2>&1 && (ехо процес %process_to_check% се изпълнява) || (ехо процес %process_to_check% не се изпълнява) изход /b ************** край на JSCRIPT КОМЕНТАР **/ var winmgmts = GetObject("winmgmts:\\\\.\\root \\cimv2"); var colProcess = winmgmts.ExecQuery("Изберете * от Win32_Process"); var процеси = нов изброител(colProcess); за (;!processes.atEnd();processes.moveNext()) ( var process=processes.item(); WScript.Echo(process.processID + " " + process.Name); )

Тези две опции могат да се използват на машини без TASKLIST.

Крайната техника използва MSHTA. Това ще работи на всички машини с Windows от XP и по-нови и е независимо от Настройки на Windowsсценарий. извикването на MSHTA може леко да влоши производителността (отново, трябва да запазите като bat):

@if (@X)==(@Y) @end /* JSCRIPT КОМЕНТАР ** @echo off setlocal if "%~1" equ "" echo предава името на процеса като аргумент forst && exit /b 1:: първи аргумент е процесът, който искате да проверите, ако се изпълнява set process_to_check=%~1 mshta "about:" | find /i "%process_to_check%" >nul 2>&1 && (ехо процес %process_to_check% се изпълнява) || (ехо процес %process_to_check% не се изпълнява) endlocal изход /b ************** край на JSCRIPT КОМЕНТАР **/ var fso= нов ActiveXObject("Scripting.FileSystemObject").GetStandardStream( 1); var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2"); var colProcess = winmgmts.ExecQuery("Изберете * от Win32_Process"); var процеси = нов изброител(colProcess); for (;!processes.atEnd();processes.moveNext()) ( var process=processes.item(); fso.Write(process.processID + " " + process.Name + "\n"); ) close( );