Kontrola, či proces beží. Ako skontrolovať, či proces beží pomocou dávkového skriptu

Kontrola, či proces beží. Ako skontrolovať, či proces beží pomocou dávkového skriptu

Páčia sa mi nástroje WMIC a TASKLIST, ale nie sú dostupné v oknách domácej/hlavnej edície. Ďalším spôsobom je použiť príkazy QPROCESS dostupné takmer v každom okne stroja (pre tie, ktoré majú terminálové služby - myslím, že bez nich vyhráva iba XP. SP2, teda prakticky každé okno auta):

@echo off:check_process setlocal if "%~1" equ "" echo odovzdať názov procesu ako prvý argument && exit /b 1:: prvý argument je proces, ktorý chcete skontrolovať, či beží set process_to_check=%~1:: QPROCESS môže zobraziť iba prvých 12 symbolov bežiaceho procesu:: Ak sa použije iný nástroj, riadok nižšie možno vymazať set process_to_check=%process_to_check:~0,12% QPROCESS * | nájdite /i "%process_to_check%" >nul 2>

Príkaz QPROCESS nie je taký výkonný ako TASKLIST a je obmedzený na zobrazovanie iba 12 znakov názvu procesu, ale mal by sa vziať do úvahy, ak TASKLIST nie je k dispozícii.

Jednoduchšie použitie, kde sa ako argument používa názov procesu if (prípona .exe sa v tomto prípade vyžaduje, keď zadáte názov spustiteľného súboru):

@echo off:check_process setlocal if "%~1" equ "" echo odovzdať názov procesu ako prvý argument && exit /b 1:: prvý argument je proces, ktorý chcete skontrolovať, či je spustenie:: prípona .exe povinná set " process_to_check=%~1" QPROCESS "%process_to_check%" >nul 2>&1 && (proces echo %process_to_check% je spustený) || (echo proces %process_to_check% nie je spustený) endlocal

Rozdiel medzi týmito dvoma spôsobmi použitia QPROCESS je v tom, že QPROCESS * zobrazí zoznam všetkých procesov, zatiaľ čo QPROCESS some.exe bude filtrovať iba procesy pre súčasný užívateľ.

Možnosťou je aj použitie objektov WMI prostredníctvom hostiteľského exe skriptu Windows namiesto WMIC. Mal by tiež bežať na všetkých Počítače so systémom Windows(okrem tých, kde je vypnuté WSH, ale toto je zriedkavý prípad, tu je súbor bat, ktorý obsahuje zoznam všetkých procesov prostredníctvom tried WMI a možno ho použiť namiesto QPROCESS v skripte vyššie (toto je hybrid JScript/bat a mal by byť). uložené ako .bat ):

@if (@X)==(@Y) @end /* KOMENTÁR JSCRIPT ** @echo off cscript //E:JScript //nologo "%~f0" exit /b ********** **** koniec KOMENTÁRA JSCRIPT **/ var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2"); var colProcess = winmgmts.ExecQuery("Vybrať * z Win32_Process"); var procesy = new Enumerator(colProcess); for (;!processes.atEnd();processes.moveNext()) ( var process=processes.item(); WScript.Echo(process.processID + " " + process.Name); )

A modifikácia, ktorá skontroluje, či proces beží:

@if (@X)==(@Y) @end /* KOMENTÁR JSCRIPT ** @echo off if "%~1" equ "" echo odovzdať názov procesu ako prvý argument && exit /b 1:: prvý argument je proces, ktorý chcete skontrolovať, či je spustený set process_to_check=%~1 cscript //E:JScript //nologo "%~f0" | nájsť /i "%process_to_check%" >nul 2>&1 && (proces echo %process_to_check% je spustený) || (proces echo %process_to_check% nie je spustený) exit /b ************ koniec KOMENTÁRA JSCRIPT **/ var winmgmts = GetObject("winmgmts:\\\\.\\root \\cimv2"); var colProcess = winmgmts.ExecQuery("Vybrať * z Win32_Process"); var procesy = new Enumerator(colProcess); for (;!processes.atEnd();processes.moveNext()) ( var process=processes.item(); WScript.Echo(process.processID + " " + process.Name); )

dve možnosti môžu byť použité na strojoch, ktoré nemajú TASKLIST.

Konečnú techniku ​​používa MSHTA. Toto bude fungovať na všetkých počítačoch so systémom Windows s XP a vyšším a je nezávislé od nastavení hostiteľa Windows Script. volanie MSHTA však môže trochu ušetriť na výkone (opäť je potrebné uložiť v pálke):

@if (@X)==(@Y) @end /* KOMENTÁR JSCRIPT ** @echo off setlocal if "%~1" equ "" echo odovzdať názov procesu ako prvý argument && exit /b 1:: prvý argument je proces, ktorý chcete skontrolovať, či je spustený set process_to_check=%~1 mshta "about:" | nájsť /i "%process_to_check%" >nul 2>&1 && (proces echo %process_to_check% je spustený) || (proces echo %process_to_check% nie je spustený) endlocal exit /b ************** koniec KOMENTÁRA JSCRIPT **/ var fso= new ActiveXObject("Scripting.FileSystemObject").GetStandardStream( 1); var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2"); var colProcess = winmgmts.ExecQuery("Vybrať * z Win32_Process"); var procesy = new Enumerator(colProcess); for (;!processes.atEnd();processes.moveNext()) ( var process=processes.item(); fso.Write(process.processID + " " + process.Name + "\n"); ) close( );

Snažím sa zistiť, či proces beží na základe ID procesu. Kód vyzerá na základe jedného z príspevkov fóra takto. Nemôžem sa pozrieť na názov procesu, pretože pod rovnakým názvom beží viacero procesov.

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 -c ps -ef | grep 71676 1111 72314 72312 0 0:00,00 ttys000 0:00,00 grep 71676

Vždy vráti hodnotu true, pretože dokáže nájsť ID procesu vo výstupnom reťazci.

Nejaké návrhy? Ďakujem za každú pomoc.

11 Riešenia zbierať formulár web pre „Skontrolujte, či proces beží v Pythone (v systéme Linux/Unix)“

Skúste:

Os.kill(pid, 0)

Mal by uspieť (a nerobiť nič), ak proces existuje, alebo vyhodiť výnimku (ktorú môžete zachytiť), ak proces neexistuje.

Najjednoduchšia odpoveď podľa mňa (aj keď nemusí byť ideálna) je zmeniť sa

Ps-ef | grep

Za účelom:

Ps-ef | grep | grep -v grep

Toto bude ignorovať vyhľadávací zoznam procesov grep obsahujúci PID procesu, ktorý sa pokúšate nájsť.

Zdá sa, že odpoveď používateľa 9876 je oveľa viac „pythonic“.

Toto je trochu zmätok, ale na *nix môžete použiť os.getpgid(pid) alebo os.kill(pid, sig) na kontrolu prítomnosti id procesu.

Import os def is_process_running(process_id): skúste: os.kill(process_id, 0) return True okrem OSError: return False

EDIT: Všimnite si, že os.kill funguje na Windows (s Pythonom 2.7) a os.getpgid nebude. ale Verzia systému Windows volá TerminateProcess(), čo „bezpodmienečne vynúti ukončenie procesu“, takže predpokladám, že bezpečne nevráti potrebné informácie bez toho, aby proces v skutočnosti nezabil, ak existuje.

Ak používate Windows, dajte nám vedieť, pretože žiadne z týchto riešení nie je v tomto scenári prijateľné.

Môžete skontrolovať, či existuje priečinok /proc/.

>>> import os.path >>> os.path.exists("/proc/0") Nepravda >>> os.path.exists("/proc/12") Pravda

Pozri Takže: Ako testujete Linux s Pythonom, ak proces stále beží?

Ak vám nevadí použiť externý modul, navrhol by som psutil . Je to multiplatformové a ľahšie sa používa ako spawning subshell len za účelom nájdenia aktuálneho procesu.

Ak tento proces vlastní rovnaký používateľ, proces overovania, môžete sa ho jednoducho pokúsiť zabiť. Ak použijete signál 0, kill nepošle nič, ale aj tak vám dá vedieť, či je proces dostupný.

Ak je sig 0, potom sa nevyšle žiadny signál, ale stále sa vykonáva kontrola chýb; toto možno použiť na kontrolu prítomnosti ID procesu alebo ID skupiny procesov.

To by sa malo zodpovedajúcim spôsobom rozšíriť na metódy python.

Viem, že je to staré, ale použil som to a zdá sa, že to funguje; môžete sa rýchlo prispôsobiť konverzii z názvu procesu na ID procesu:

Skúste: if len(os.popen("ps -aef | grep -i "môj proces" | grep -v "grep" | awk "( print $3 )"").read().strip().split("\ n")) > 1: zvýšiť SystemExit(0) okrem výnimky, e: zvýšiť e

V systéme Windows je ďalšou možnosťou použiť tasklist.exe:

Syntax: 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() ak processId vo výstupe: return True return False

V systéme Windows môžete použiť WMI.

Z win32com.client importujte GetObject GetObject("winmgmts:").ExecQuery("Vyberte * z Win32_Process kde ProcessId = " + str(pid)).count

Môžete použiť aj iné filtre. Napríklad, pravdepodobne chcem len povedať, či proces podľa názvu beží a vykonáva akciu. Napríklad, ak DbgView nie je spustený, spustite ho.

Ak nie GetObject("winmgmts:").ExecQuery("Vyberte * z Win32_Process, kde Name = "dbgview.exe"").count: subprocess.Popen(r"C:\U\dbgview.exe", shell=False)

Môžete tiež opakovať a robiť ďalšie skvelé veci. Úplný zoznam polia je tu.

Nedávno som musel uviesť zoznam súčasných procesov a toto:

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, ak returnprocess == False: vypíšte "žiadny proces sa nevykonáva" ak returnprocess == True: vypíš "proces sa nevykonáva"

Musíte to nájsť dvakrát.

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

Ak vráti True, potom to skutočne funguje!

Páčia sa mi nástroje WMIC a TASKLIST, ale nie sú dostupné v domovskej/hlavnej verzii systému Windows. Ďalším spôsobom je použitie príkazu QPROCESS, ktorý je k dispozícii takmer na všetkých počítačoch so systémom Windows (pre tie, ktoré majú terminálové služby - myslím, že win XP bez SP2, takže takmer každý Počítač so systémom Windows):

@echo off:check_process setlocal if "%~1" equ "" echo odovzdať názov procesu ako prvý argument && exit /b 1:: prvý argument je proces, ktorý chcete skontrolovať, či beží set process_to_check=%~1:: QPROCESS môže zobraziť iba prvých 12 symbolov bežiaceho procesu:: Ak sa použije iný nástroj, riadok nižšie možno vymazať set process_to_check=%process_to_check:~0,12% QPROCESS * | nájdite /i "%process_to_check%" >nul 2>

Príkaz QPROCESS nie je taký výkonný ako TASKLIST a je obmedzený na zobrazenie len 12 znakov názvu procesu, ale mal by sa zvážiť, ak TASKLIST nie je dostupný.

Jednoduchšie použitie je tam, kde sa ako argument používa názov procesu (prípona .exe sa v tomto prípade vyžaduje, keď zadáte názov spustiteľného súboru):

@echo off:check_process setlocal if "%~1" equ "" echo odovzdať názov procesu ako prvý argument && exit /b 1:: prvý argument je proces, ktorý chcete skontrolovať, či je spustenie:: prípona .exe povinná set " process_to_check=%~1" QPROCESS "%process_to_check%" >nul 2>&1 && (proces echo %process_to_check% je spustený) || (echo proces %process_to_check% nie je spustený) endlocal

Rozdiel medzi týmito dvoma spôsobmi použitia QPROCESS je v tom, že QPROCESS * zobrazí zoznam všetkých procesov, zatiaľ čo QPROCESS some.exe bude filtrovať iba procesy pre aktuálneho používateľa.

Možnosťou je aj použitie objektov WMI prostredníctvom hostiteľského exe skriptu Windows namiesto WMIC. Mal by tiež bežať na všetkých počítačoch so systémom Windows (okrem tých, kde je vypnuté WSH, ale toto je zriedkavý prípad). Tu bat súbor ktorý uvádza všetky procesy prostredníctvom tried WMI a možno ho použiť namiesto QPROCESS v skripte vyššie (toto je hybrid jscript/bat a mal by byť uložený ako .bat):

@if (@X)==(@Y) @end /* KOMENTÁR JSCRIPT ** @echo off cscript //E:JScript //nologo "%~f0" exit /b ********** **** koniec KOMENTÁRA JSCRIPT **/ var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2"); var colProcess = winmgmts.ExecQuery("Vybrať * z Win32_Process"); var procesy = new Enumerator(colProcess); for (;!processes.atEnd();processes.moveNext()) ( var process=processes.item(); WScript.Echo(process.processID + " " + process.Name); )

A modifikácia, ktorá skontroluje, či proces beží:

@if (@X)==(@Y) @end /* KOMENTÁR JSCRIPT ** @echo off if "%~1" equ "" echo odovzdať názov procesu ako prvý argument && exit /b 1:: prvý argument je proces, ktorý chcete skontrolovať, či je spustený set process_to_check=%~1 cscript //E:JScript //nologo "%~f0" | nájsť /i "%process_to_check%" >nul 2>&1 && (proces echo %process_to_check% je spustený) || (proces echo %process_to_check% nie je spustený) exit /b ************ koniec KOMENTÁRA JSCRIPT **/ var winmgmts = GetObject("winmgmts:\\\\.\\root \\cimv2"); var colProcess = winmgmts.ExecQuery("Vybrať * z Win32_Process"); var procesy = new Enumerator(colProcess); for (;!processes.atEnd();processes.moveNext()) ( var process=processes.item(); WScript.Echo(process.processID + " " + process.Name); )

Tieto dve možnosti je možné použiť na strojoch bez TASKLISTU.

Konečná technika využíva MSHTA. Toto bude fungovať na všetkých počítačoch so systémom Windows so systémom XP a vyšším a nezávisí od Nastavenia systému Windows skript. volanie MSHTA môže trochu znížiť výkon (opäť musíte uložiť ako bat):

@if (@X)==(@Y) @end /* KOMENTÁR JSCRIPT ** @echo off setlocal if "%~1" equ "" echo odovzdať názov procesu ako prvý argument && exit /b 1:: prvý argument je proces, ktorý chcete skontrolovať, či je spustený set process_to_check=%~1 mshta "about:" | nájsť /i "%process_to_check%" >nul 2>&1 && (proces echo %process_to_check% je spustený) || (proces echo %process_to_check% nie je spustený) endlocal exit /b ************** koniec KOMENTÁRA JSCRIPT **/ var fso= new ActiveXObject("Scripting.FileSystemObject").GetStandardStream( 1); var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2"); var colProcess = winmgmts.ExecQuery("Vybrať * z Win32_Process"); var procesy = new Enumerator(colProcess); for (;!processes.atEnd();processes.moveNext()) ( var process=processes.item(); fso.Write(process.processID + " " + process.Name + "\n"); ) close( );