DZWON

Są tacy, którzy czytali tę wiadomość przed tobą.
Zapisz się, aby otrzymywać świeże artykuły.
E-mail
Nazwa
Nazwisko
Jak chcesz przeczytać „Dzwon”?
Bez spamu

Podobają mi się narzędzia WMIC i TASKLIST, ale nie są one dostępne w oknach edycji domowej/głównej.Innym sposobem jest użycie poleceń QPROCESS dostępnych w prawie każdym oknie maszyny (dla tych, którzy mają usługi terminalowe - myślę, że tylko XP wygrywa bez SP2, czyli praktycznie każda szyba samochodowa):

@echo off:check_process setlocal if "%~1" equ "" echo przekaż nazwę procesu jako pierwszy argument && exit /b 1:: pierwszy argument to proces, który chcesz sprawdzić, czy działa set proces_to_check=%~1:: QPROCESS może wyświetlić tylko pierwszych 12 symboli działającego procesu:: Jeśli zostanie użyte inne narzędzie, poniższą linię można usunąć. set Process_to_check=%process_to_check:~0.12% QPROCESS * | znajdź /i "%process_to_check%" >nul 2>

Komenda QPROCESS nie ma tak potężnych możliwości jak TASKLIST i ogranicza się do wyświetlania tylko 12 znaków nazwy procesu, ale należy ją wziąć pod uwagę, jeśli lista TASKLIST nie jest dostępna.

Prostsze użycie, w którym używa nazwy, jeśli proces jest argumentem (w tym przypadku wymagany jest przyrostek.exe, gdy przekazujesz nazwę Plik wykonywalny):

@echo off:check_process setlocal if "%~1" equ "" echo podaj nazwę procesu jako pierwszy argument && exit /b 1:: pierwszy argument to proces, który chcesz sprawdzić, czy sufiks run:: .exe jest obowiązkowy set " Process_to_check=%~1" QPROCESS "%process_to_check%" >nul 2>&1 && (proces echa %process_to_check% jest uruchomiony) || (proces echa %process_to_check% nie jest uruchomiony) endlocal

Różnica pomiędzy dwoma sposobami użycia QPROCESS polega na tym, że QPROCESS * wyświetli listę wszystkich procesów, podczas gdy QPROCESS Some.exe będzie filtrował tylko procesy aktualny użytkownik.

Opcją jest również używanie obiektów WMI poprzez plik exe hosta skryptu systemu Windows zamiast WMIC. Powinien także działać na wszystkich Maszyny z Windowsem(z wyjątkiem tych, gdzie WSH jest wyłączone, ale jest to rzadki przypadek). Oto plik bat, który zawiera listę wszystkich procesów poprzez klasy WMI i może być używany zamiast QPROCESS w powyższym skrypcie (jest to hybryda JScript/bat i powinien być zapisane jako .bat ):

@if (@X)==(@Y) @end /* KOMENTARZ JSCRIPT ** @echo off cscript //E:JScript //nologo "%~f0" wyjście /b ********** **** koniec KOMENTARZA JSCRIPT **/ var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2"); var colProcess = winmgmts.ExecQuery("Wybierz * z Win32_Process"); var procesy = nowy moduł wyliczający(colProcess); for (;!processes.atEnd();processes.moveNext()) ( var proces=processes.item(); WScript.Echo(process.processID + " " + Process.Name); )

Oraz modyfikacja, która sprawdzi czy proces działa:

@if (@X)==(@Y) @end /* KOMENTARZ JSCRIPT ** @echo off if "%~1" equ "" echo przekazuje nazwę procesu jako pierwszy argument && wyjście /b 1:: pierwszy argument to proces, który chcesz sprawdzić, czy działa set Process_to_check=%~1 cscript //E:JScript //nologo "%~f0" | znajdź /i "%process_to_check%" >nul 2>&1 && (proces echa %process_to_check% jest uruchomiony) || (proces echa %process_to_check% nie jest uruchomiony) exit /b **************** koniec JSCRIPT KOMENTARZ **/ var winmgmts = GetObject("winmgmts:\\\\.\\root \\cimv2"); var colProcess = winmgmts.ExecQuery("Wybierz * z Win32_Process"); var procesy = nowy moduł wyliczający(colProcess); for (;!processes.atEnd();processes.moveNext()) ( var proces=processes.item(); WScript.Echo(process.processID + " " + Process.Name); )

dwie opcje mogą być użyte na komputerach, które nie mają listy zadań.

Ostatnią technikę stosuje MSHTA. Będzie to działać na wszystkich komputerach z systemem Windows z systemem XP i nowszym i jest niezależne od ustawień Host systemu Windows Scenariusz. wywołanie MSHTA może jednak nieco zaoszczędzić na wydajności (ponownie należy zapisać w nietoperzu):

@if (@X)==(@Y) @end /* KOMENTARZ JSCRIPT ** @echo off setlocal if "%~1" equ "" echo przekaż nazwę procesu jako pierwszy argument && wyjście /b 1:: pierwszy argument to proces, który chcesz sprawdzić, czy działa set Process_to_check=%~1 mshta "about:" | znajdź /i "%process_to_check%" >nul 2>&1 && (proces echa %process_to_check% jest uruchomiony) || (proces echa %process_to_check% nie jest uruchomiony) endlocal exit /b **************** koniec JSCRIPT KOMENTARZ **/ var fso= new ActiveXObject("Scripting.FileSystemObject").GetStandardStream( 1); var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2"); var colProcess = winmgmts.ExecQuery("Wybierz * z Win32_Process"); var procesy = nowy moduł wyliczający(colProcess); for (;!processes.atEnd();processes.moveNext()) ( var proces=processes.item(); fso.Write(identyfikator procesu + " " + nazwa.procesu + "\n"); ) zamknij( );

Próbuję sprawdzić, czy proces jest uruchomiony na podstawie identyfikatora procesu. Kod wygląda tak, na podstawie jednego z postów na forum. Nie mogę sprawdzić nazwy procesu, ponieważ pod tą samą nazwą działa wiele procesów.

Def findProcess(Idprocesu): ps= subprocess.Popen("ps -ef | grep "+Identyfikator procesu, powłoka=True, stdout=podproces.PIPE) wyjście = ps.stdout.read() ps.stdout.close() ps. wait() zwraca wyjście def isProcessRunning(processId): wyjście = findProcess(processId) jeśli re.search(processId, wyjście) ma wartość Brak: zwróć 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

Zawsze zwraca wartość true, ponieważ może znaleźć identyfikator procesu w ciągu wyjściowym.

Jakieś sugestie? Dziękuję za jakąkolwiek pomoc.

11 rozwiązań zebranych z Internetu dla „Sprawdź, czy proces działa w Pythonie (w systemie Linux/Unix)”

Próbować:

Os.kill(pid, 0)

Powinien odnieść sukces (i nic nie robić), jeśli proces istnieje, lub zgłosić wyjątek (który można przechwycić), jeśli proces nie istnieje.

Moim zdaniem najprostszą odpowiedzią (choć może nie być idealną) jest zmiana

PS-ef | grep

W celu:

PS-ef | gre | grep -v grep

Spowoduje to zignorowanie listy procesów grepa zawierającej PID procesu, który próbujesz znaleźć.

Najwyraźniej odpowiedź użytkownika9876 jest znacznie bardziej „pythoniczna”.

To trochę niezręczne, ale na *nix możesz użyć os.getpgid(pid) lub os.kill(pid, sig), aby sprawdzić obecność identyfikatora procesu.

Importuj os def is_process_running(process_id): try: os.kill(process_id, 0) return True z wyjątkiem OSError: return False

EDYCJA: Zauważ, że os.kill działa w systemie Windows (z Pythonem 2.7) i os.getpgid nie będzie. Ale Wersja Windowsa wywołuje TerminateProcess() , która „bezwarunkowo wymusi zakończenie procesu”, więc przewiduję, że nie zwróci bezpiecznie potrzebnych informacji bez faktycznego zabicia procesu, jeśli taki istnieje.

Jeśli używasz systemu Windows, daj nam znać, ponieważ żadne z tych rozwiązań nie jest dopuszczalne w tym scenariuszu.

Możesz sprawdzić, czy folder /proc/ istnieje.

>>> import os.path >>> os.path.exists("/proc/0") Fałsz >>> os.path.exists("/proc/12") Prawda

Zobacz więc: Jak sprawdzić Linuksa za pomocą Pythona, jeśli proces nadal działa?

Jeśli nie masz nic przeciwko użyciu modułu zewnętrznego, sugerowałbym psutil. Jest wieloplatformowy i łatwiejszy w użyciu niż podpowłoka spawnująca tylko w celu znalezienia bieżącego procesu.

Jeśli właścicielem tego procesu jest ten sam użytkownik, możesz po prostu spróbować go zabić. Jeśli użyjesz sygnału 0, kill nie wyśle ​​niczego, ale nadal poinformuje Cię, czy proces jest dostępny.

Jeśli sig wynosi 0, wówczas żaden sygnał nie jest wysyłany, ale nadal przeprowadzane jest sprawdzanie błędów; można tego użyć do sprawdzenia obecności identyfikatora procesu lub identyfikatora grupy procesów.

Powinno to zostać odpowiednio propagowane do metod Pythona.

Wiem, że to stare, ale użyłem tego i wydaje się działać; możesz szybko dostosować się do konwersji nazwy procesu na identyfikator procesu:

Spróbuj: if len(os.popen("ps -aef | grep -i "myprocess" | grep -v "grep" | awk "( print $3 )"").read().strip().split("\ n")) > 1: podnieś SystemExit(0) z wyjątkiem wyjątku, e: podnieś e

W systemie Windows inną opcją jest użycie tasklist.exe:

Składnia: tasklist.exe /NH /FI „PID eq ProcessID”

Def IsProcessRunning(processId): ps= subprocess.Popen(r"tasklist.exe /NH /FI "PID eq %d"" % (processId), powłoka=True, stdout=subprocess.PIPE) wyjście = ps.stdout.read () ps.stdout.close() ps.wait() jeśli identyfikator procesu na wyjściu: return True return False

W systemie Windows można korzystać z usługi WMI.

Z win32com.client import GetObject GetObject("winmgmts:").ExecQuery("Wybierz * z Win32_Process gdzie ProcessId = " + str(pid)).count

Możesz także użyć innych filtrów. Na przykład prawdopodobnie chcę po prostu sprawdzić, czy proces po nazwie jest uruchomiony i podejmuje działanie. Na przykład, jeśli DbgView nie jest uruchomiony, uruchom go.

Jeśli nie GetObject("winmgmts:").ExecQuery("Wybierz * z Win32_Process, gdzie nazwa = "dbgview.exe"").count: subprocess.Popen(r"C:\U\dbgview.exe", powłoka=False)

Możesz także iterować i robić inne fajne rzeczy. Pełna lista pola są tutaj.

Ostatnio musiałem spisać bieżące procesy i to:

Def check_process(proces): importuj ponownie import podprocesu returnprocess = False s = subprocess.Popen(["ps", "ax"],stdout=podproces.PIPE) dla x w s.stdout: if re.search(proces, x ): returnprocess = True, jeśli returnprocess == False: drukuj „żaden proces nie jest wykonywany”, jeśli returnprocess == True: drukuj „proces jest wykonywany”

Trzeba go znaleźć dwa razy.

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

Jeśli zwróci True, to rzeczywiście działa!

Podobają mi się narzędzia WMIC i TASKLIST, ale nie są one dostępne w domowych/głównych wersjach systemu Windows. Innym sposobem jest użycie polecenia QPROCESS, dostępnego na prawie wszystkich komputerach z systemem Windows (dla tych, które mają usługi terminalowe - myślę, że wygrywają tylko XP bez SP2, więc prawie wszyscy Komputer z Windowsem):

@echo off:check_process setlocal if "%~1" equ "" echo przekaż nazwę procesu jako pierwszy argument && exit /b 1:: pierwszy argument to proces, który chcesz sprawdzić, czy działa set proces_to_check=%~1:: QPROCESS może wyświetlić tylko pierwszych 12 symboli działającego procesu:: Jeśli zostanie użyte inne narzędzie, poniższą linię można usunąć. set Process_to_check=%process_to_check:~0.12% QPROCESS * | znajdź /i "%process_to_check%" >nul 2>

Komenda QPROCESS nie ma tak potężnych możliwości jak TASKLIST i ogranicza się do wyświetlenia zaledwie 12 znaków nazwy procesu, ale należy ją wziąć pod uwagę, jeśli lista TASKLIST nie jest dostępna.

Prostsze użycie polega na tym, że używa nazwy if proces jako argumentu (w tym przypadku wymagany jest przyrostek .exe, gdy przekazujesz nazwę pliku wykonywalnego):

@echo off:check_process setlocal if "%~1" equ "" echo podaj nazwę procesu jako pierwszy argument && exit /b 1:: pierwszy argument to proces, który chcesz sprawdzić, czy sufiks run:: .exe jest obowiązkowy set " Process_to_check=%~1" QPROCESS "%process_to_check%" >nul 2>&1 && (proces echa %process_to_check% jest uruchomiony) || (proces echa %process_to_check% nie jest uruchomiony) endlocal

Różnica pomiędzy tymi dwoma sposobami użycia QPROCESS polega na tym, że QPROCESS * wyświetli listę wszystkich procesów, podczas gdy QPROCESS Some.exe będzie filtrował tylko procesy dla bieżącego użytkownika.

Opcją jest również używanie obiektów WMI poprzez plik exe hosta skryptu systemu Windows zamiast WMIC. Powinien także działać na wszystkich komputerach z systemem Windows (z wyjątkiem tych, na których WSH jest wyłączone, ale jest to rzadki przypadek). Oto plik bat, który zawiera listę wszystkich procesów poprzez klasy WMI i może być użyty zamiast QPROCESS w powyższym skrypcie (jest to hybryda jscript/bat i powinien być zapisany jako .bat):

@if (@X)==(@Y) @end /* KOMENTARZ JSCRIPT ** @echo off cscript //E:JScript //nologo "%~f0" wyjście /b ********** **** koniec KOMENTARZA JSCRIPT **/ var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2"); var colProcess = winmgmts.ExecQuery("Wybierz * z Win32_Process"); var procesy = nowy moduł wyliczający(colProcess); for (;!processes.atEnd();processes.moveNext()) ( var proces=processes.item(); WScript.Echo(process.processID + " " + Process.Name); )

Oraz modyfikacja, która sprawdzi czy proces działa:

@if (@X)==(@Y) @end /* KOMENTARZ JSCRIPT ** @echo off if "%~1" equ "" echo przekazuje nazwę procesu jako pierwszy argument && wyjście /b 1:: pierwszy argument to proces, który chcesz sprawdzić, czy działa set Process_to_check=%~1 cscript //E:JScript //nologo "%~f0" | znajdź /i "%process_to_check%" >nul 2>&1 && (proces echa %process_to_check% jest uruchomiony) || (proces echa %process_to_check% nie jest uruchomiony) exit /b **************** koniec JSCRIPT KOMENTARZ **/ var winmgmts = GetObject("winmgmts:\\\\.\\root \\cimv2"); var colProcess = winmgmts.ExecQuery("Wybierz * z Win32_Process"); var procesy = nowy moduł wyliczający(colProcess); for (;!processes.atEnd();processes.moveNext()) ( var proces=processes.item(); WScript.Echo(process.processID + " " + Process.Name); )

Tych dwóch opcji można używać na komputerach bez listy zadań.

Ostatnia technika wykorzystuje MSHTA. Będzie to działać na wszystkich komputerach z systemem Windows z systemem XP i nowszym i nie zależy od tego Ustawienia Windowsa scenariusz. wywołanie MSHTA może nieco zmniejszyć wydajność (ponownie musisz zapisać jako nietoperz):

@if (@X)==(@Y) @end /* KOMENTARZ JSCRIPT ** @echo off setlocal if "%~1" equ "" echo przekaż nazwę procesu jako pierwszy argument && wyjście /b 1:: pierwszy argument to proces, który chcesz sprawdzić, czy działa set Process_to_check=%~1 mshta "about:" | znajdź /i "%process_to_check%" >nul 2>&1 && (proces echa %process_to_check% jest uruchomiony) || (proces echa %process_to_check% nie jest uruchomiony) endlocal exit /b **************** koniec JSCRIPT KOMENTARZ **/ var fso= new ActiveXObject("Scripting.FileSystemObject").GetStandardStream( 1); var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2"); var colProcess = winmgmts.ExecQuery("Wybierz * z Win32_Process"); var procesy = nowy moduł wyliczający(colProcess); for (;!processes.atEnd();processes.moveNext()) ( var proces=processes.item(); fso.Write(identyfikator procesu + " " + nazwa.procesu + "\n"); ) zamknij( );

DZWON

Są tacy, którzy czytali tę wiadomość przed tobą.
Zapisz się, aby otrzymywać świeże artykuły.
E-mail
Nazwa
Nazwisko
Jak chcesz przeczytać „Dzwon”?
Bez spamu