La cloche.

Il y a ceux qui ont lu cette nouvelle devant vous.
Abonnez-vous pour recevoir des articles frais.
E-mail
Nom
Nom de famille
Comment voulez-vous lire la cloche
Sans spam

J'aime les outils Wmic et TaskList, mais ils ne sont pas disponibles dans la maison / les éditions principales de Windows.Anutrice, c'est d'utiliser des commandes QProcess disponibles sur presque toutes les fenêtres de la machine (pour ceux qui ont des services de terminal - je pense que seule la victoire XP SP2 sans, donc Practialy chaque fenêtre de la machine):

@echo Off: check_process setlocal si "% ~ 1" EQU "" Echo Transmettez le nom processus Comme Forst Argument && Sortie / B 1 :: premier argument est le processus que vous voulez vérifier si vous utilisez Set Process_To_Check \u003d% ~ 1 :: QProcess Peut afficher uniquement les 12 premiers symboles du processus en cours: Trouver / i "% Process_To_Check%"\u003e Nul 2\u003e

QProcess. La commande n'est pas aussi forte que la liste des tâches et est limitée dans le spectacle seulement 12 caractères du nom du processus, mais doit être prise en compte si la liste des tâches n'est pas disponible.

Plus simple à utiliser où il utilise le nom si le processus est comme un argument (suffixe.exe est obligatoire dans ce cas, lorsque vous transmettez le nom du fichier exécutable):

@echo Off: Check_Process SetLocal Si "% ~ 1" Equal "" Echo Passez le nom du processus comme Forst Argument && Exit / B 1 :: Premier argument est le processus que vous souhaitez vérifier si l'exécution :: .exe suffixe est un ensemble obligatoire " Process_To_Check \u003d% ~ 1 "qprocess"% process_to_check% "\u003e Nul 2\u003e & 1 && (ECHO Process% Process_To_Check% est en cours d'exécution) || (ECHO Process% Process_To_Check% n'est pas en cours d'exécution) endlocal

La différence entre deux méthodes d'utilisation QProcess que QProcess * répertorie tous les processus, tandis que Qprocess Certain.exe filtrera uniquement les processus de utilisateur actuel.

L'utilisation d'objets WMI via Windows Script Host Exe au lieu de WMIC est également une option. Il doit également commencer sur toutes les machines Windows (l'exclusion de ceux où WSH est désactivé, mais cela est un cas rare). Le fichier est une chauve-souris du fichier qui répertorie tous les processus à travers les classes WMI et peuvent être utilisés à la place de QProcess dans le script ci - dessus (ce qui est un hybride JScript / Bat souris et doit être sauvé .BAT):

@if (@x) \u003d\u003d (@ y) @end / * commentaire JScript ** @echo off cscript // E: // JScript nologo "% ~ F0" EXIT / B ********** **** Fin de JScript Commentaire ** / var winmgmts \u003d getObject ("Winmgmts: \\\\\\\\\\. \\\\\\\\ \\\\ \\\\ \\\\ \\\\ cimv2"); var colprocess \u003d winmgmts.execquery ("Select * de win32_process"); Processes var \u003d nouvel énumérateur (ColProcess); pour (;! processus.tend (); processus.movenext ()) (var process \u003d processus.item (); wscript.echo (processus.processid + "+ processus.name);)

Et une modification qui vérifiera si le processus est lancé:

@if (@x) \u003d\u003d (@ y) @end / * commentaire JScript ** @echo off si "% ~ 1" EQU "" Echo Le processus passe Nom Comme Forst Argument && Sortie / B 1 :: premier argument est Le processus que vous souhaitez cocher si vous exécutez Set Set Process_To_Check \u003d% ~ 1 cscript // e: jscript // nologo "% ~ f0" | Trouver / i "% Process_To_Check%"\u003e Nul 2\u003e & 1 && (ECHO Process% Process_To_Check% est en cours d'exécution) || (ECHO Process% Process_To_Check% n'est pas en cours d'exécution) Quitter / B *************** Fin de JScript Commentaire ** / var winmgmts \u003d getObject ("Winmgmts: \\\\\\\\\\. \\\\ root \\\\ cimv2 "); var colprocess \u003d winmgmts.execquery ("Select * de win32_process"); Processes var \u003d nouvel énumérateur (ColProcess); pour (;! processus.tend (); processus.movenext ()) (var process \u003d processus.item (); wscript.echo (processus.processid + "+ processus.name);)

deux options peuvent être utilisées sur des machines qui n'ont pas de liste de tâches.

La technique finale est utilisée par MSHTA. Cela fonctionnera sur toutes les machines Windows avec XP et ci-dessus et ne dépend pas des paramètres. windows hôte Scénario. Le défi MSHTA peut réduire un peu de performance, bien que (à nouveau soit enregistré à la batterie de la BAT):

@if (@x) \u003d\u003d (@ y) @end / * Jscript Commentaire ** @echo Off SetLocal si "% ~ 1" EQU "" Echo passe le nom du processus comme Forst Argument && sortie / B 1 :: Premier argument Est-ce que le processus que vous voulez vérifier si vous exécutez SET SET Process_To_Check \u003d% ~ 1 MSHTA »À propos de:"| Trouver / i"% Process_To_Check% "\u003e Nul 2\u003e & 1 && (ECHO Process% Process_To_Check% est en cours d'exécution) || (ECHO Process% Process_To_Check% n'est pas en cours d'exécution) Exit dedlocal / B ********* * ***** Fin de JScript Commentaire ** / var OFS \u003d Nouveau ActiveXObject ( "Scripting.FileSystemObject") Getstandardstream (1); var \u003d winmgmts GetObject ( "winmgmts:.. \\\\\\\\ \\\\ racine \\\\ CIMV2 "); var \u003d colprocess winmgmts.execquery (" select * from Win32_Process "); processus var \u003d new recenseur (colprocess), pour (;! processes.atend (); processes.movenext ()) (processus var \u003d processes.Item ); Fso.write (processus.processid + "" + processus.name + "\\ n");) fermer ();

J'essaie de déterminer si le processus est basé sur l'identifiant de processus. Le code ressemble à cela, en fonction de l'un des messages sur le forum. Je ne peux pas envisager le nom du processus, car plusieurs processus fonctionnent sous le même nom.

Def FindProcess: PS \u003d subprocess.Popen ( "PS -ef | grep" + ProcessID, Shell \u003d True, stdout \u003d subprocess.pipe) \u003d sortie ps.stdout.read () ps.stdout.close () PS Wait (). retour de sortie DEF ISPROCESSRUNING (ProcessID): sortie \u003d FindProcessid (ProcessID) ifput IF Re.Search (ProcessID, Output) est none: Vrai retour Autres: retour 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

Il retourne toujours vrai, car il peut trouver l'ID de processus à la ligne de sortie.

Aucune suggestion? Merci pour toute aide.

11 Solutions collectez le formulaire Web pour «Vérifiez si le processus est en cours d'exécution dans Python (sous Linux / UNIX)»

Essayer:

Os.kill (PID, 0)

Je dois réussir (et ne rien faire) si le processus existe ou lancez une exception (que vous pouvez attraper) si le processus n'existe pas.

La réponse la plus facile, à mon avis (albit, peut-être pas parfaite), est de le changer

PS -EF | Grep.

Afin de:

PS -EF | Grep. | Grep -v grep.

Il ignorera la liste des processus à rechercher un GREP, contenant le processus PID que vous essayez de trouver.

Apparemment, la réponse de l'utilisateur9876 est beaucoup plus "pythonique".

Ceci est un petit kludge, mais sur * Nix, vous pouvez utiliser OS.GetPGID (PID) ou OS.Kill (PID, SIG) pour vérifier la disponibilité de l'ID de processus.

Import OS def is_process_Running (Process_id): Essayez: OS.Kill (Process_ID, 0) Return TRUE SAUF OsError: renvoyer false

EDIT: Veuillez noter que OS.Kill fonctionne dans Windows (avec Python 2.7) et Os.getpgid ne sera pas . Mais version Windows Provoque la traduction des traitements (), qui "incondiment le processus inconditionnellement", donc je prédis que cela ne retournera pas en toute sécurité les informations dont vous avez besoin, en fait sans tuer le processus s'il existe.

Si vous utilisez Windows, indiquez-nous, car aucune de ces solutions n'est acceptable dans ce scénario.

Vous pouvez vérifier s'il y a un dossier / proc /.

\u003e\u003e\u003e Importation OS.Path \u003e\u003e\u003e OS.Path.exists ("/ proc / 0") false \u003e\u003e\u003e OS.Path.exists ("/ proc / 12") true

Voir ceci: Comment vérifiez-vous Linux avec Python si le processus est toujours en marche?

Si cela ne vous dérange pas d'utiliser un module externe, je vous suggérerais de pstule. C'est une plate-forme croisée et facile à utiliser que le sous-marin Spawn uniquement pour rechercher le processus en cours.

Si ce processus appartient au même utilisateur, le processus de vérification, vous pouvez simplement l'essayer de tuer. Si vous utilisez un 0, Kill n'enverra rien, mais vous indiquez toujours que ce processus est disponible.

Si SIG est 0, le signal n'est pas envoyé, mais le chèque d'erreur est toujours exécuté; Ceci peut être utilisé pour vérifier la présence d'un identifiant d'identifiant de processus ou de processus de processus.

Cela devrait se propager de manière appropriée aux méthodes Python.

Je sais que c'est vieux, mais je l'ai utilisé et semble travailler; Vous pouvez vous adapter rapidement à la conversion du nom de processus à l'identifiant de processus:

Essayez: Si len (os.popen ("PS -AEF | grep -i" myProcess "| grep -v" grep "| awk" (impression 3 $) ""). Lire (). Division (" \\ n "))\u003e 1: augmenter SystemExit (0) sauf exception, e: élever e

Dans Windows, une autre option consiste à utiliser TaskList.exe:

Syntaxe: TaskList.exe / NH / FI "PID EQ Procurateur"

DEF ISPROCESSRUNING (ProduitsId): PS \u003d Subprocess.Popen (R "TaskList.exe / NH / FI" PID EQ% D ""% (ProduitsId), shell \u003d true, stdout \u003d sous-processus.Pipe) Sortie \u003d ps.stdout.read. () Ps.stdout.close () ps.wait () Si processID en sortie: retour Véritable retour faux

Vous pouvez utiliser WMI dans Windows.

De Win32Com.client Import getObject getObject ("winmgmts:"). Exécutions ("Select * à partir de Win32_Process où processid \u003d" + STR (PID)). Compte

Vous pouvez également utiliser d'autres filtres. Par exemple, je voulais juste dire que le processus fonctionne par nom et entreprend. Par exemple, si DBGView n'est pas démarré, exécutez-le.

Si ce n'est pas GetObject ("Winmgmts:"). Exécutions ("Select * à partir de Win32_Process où nom \u003d" dbgview.exe ""). Compte: sous-processus.popen (r "c: \\ u \\ dbgview.exe", shell \u003d false)

Vous pouvez également régler et faire d'autres choses intéressantes. Liste complète Les champs sont ici.

J'ai récemment dû répertorier les processus actuels et donc:

DEF Check_Prision (processus): Importation RE Import Import Subprocess Recoffrocess \u003d FAUX S \u003d SUBPROCESS.POPEN (["PS", "AX"], STDOUT \u003d SOUS-PROPROCESS.PIPIPE) POUR X IN S.STDOUT: Si re.Search (processus, x ): RetourteProcess \u003d true si retourprocess \u003d\u003d FAUX: impression "Aucune exécution de processus" Si retourprocess \u003d\u003d True: Imprimer "Process exécutant"

Vous devez le trouver deux fois.

pS -EF | Grep 71676 | Sed "S / 71676 //" | Grep 71676.

Si cela revient vrai, cela fonctionne vraiment!

J'aime les outils Wmic et TaskList, mais ils ne sont pas disponibles à la maison / versions principales de Windows. Une autre solution consiste à utiliser la commande QProcess disponible presque toutes les machines Windows (pour ceux qui ont des services de terminal - je pense que Win XP sans SP2, donc pratiquement tout le monde ordinateur):

@echo Off: check_process setlocal si "% ~ 1" EQU "" Echo Transmettez le nom processus Comme Forst Argument && Sortie / B 1 :: premier argument est le processus que vous voulez vérifier si vous utilisez Set Process_To_Check \u003d% ~ 1 :: QProcess Peut afficher uniquement les 12 premiers symboles du processus en cours: Trouver / i "% Process_To_Check%"\u003e Nul 2\u003e

QProcess. La commande n'est pas aussi forte que la liste des tâches et est limitée à l'affichage de seulement 12 caractères le nom du processus, mais doit être considéré si la liste des tâches n'est pas disponible.

Utilisation plus simple Lorsqu'il utilise le nom si le processus est comme un argument (suffixe.exe est obligatoire dans ce cas lorsque vous passez le nom exécutable):

@echo Off: Check_Process SetLocal Si "% ~ 1" Equal "" Echo Passez le nom du processus comme Forst Argument && Exit / B 1 :: Premier argument est le processus que vous souhaitez vérifier si l'exécution :: .exe suffixe est un ensemble obligatoire " Process_To_Check \u003d% ~ 1 "qprocess"% process_to_check% "\u003e Nul 2\u003e & 1 && (ECHO Process% Process_To_Check% est en cours d'exécution) || (ECHO Process% Process_To_Check% n'est pas en cours d'exécution) endlocal

La différence entre les deux façons d'utiliser QProcess est que Qprocess * affiche tous les processus et Qprocess Certain.exe filtrera uniquement les processus de l'utilisateur actuel.

L'utilisation d'objets WMI via les fenêtres EXE d'hôte de script au lieu de WMIC est également une option. Il devrait également fonctionner sur toutes les machines Windows (à l'exclusion de ceux où WSH est éteint, mais c'est un cas rare). Voici le fichier BAT qui répertorie tous les processus via les classes WMI et peut être utilisé à la place de QProcess dans le script ci-dessus (il s'agit d'un hybride JScript / Bat et doit être enregistré en tant que .bat):

@if (@x) \u003d\u003d (@ y) @end / * commentaire JScript ** @echo off cscript // E: // JScript nologo "% ~ F0" EXIT / B ********** **** Fin de JScript Commentaire ** / var winmgmts \u003d getObject ("Winmgmts: \\\\\\\\\\. \\\\\\\\ \\\\ \\\\ \\\\ \\\\ cimv2"); var colprocess \u003d winmgmts.execquery ("Select * de win32_process"); Processes var \u003d nouvel énumérateur (ColProcess); pour (;! processus.tend (); processus.movenext ()) (var process \u003d processus.item (); wscript.echo (processus.processid + "+ processus.name);)

Et une modification qui vérifiera si le processus lancé:

@if (@x) \u003d\u003d (@ y) @end / * commentaire JScript ** @echo off si "% ~ 1" EQU "" Echo Le processus passe Nom Comme Forst Argument && Sortie / B 1 :: premier argument est Le processus que vous souhaitez cocher si vous exécutez Set Set Process_To_Check \u003d% ~ 1 cscript // e: jscript // nologo "% ~ f0" | Trouver / i "% Process_To_Check%"\u003e Nul 2\u003e & 1 && (ECHO Process% Process_To_Check% est en cours d'exécution) || (ECHO Process% Process_To_Check% n'est pas en cours d'exécution) Quitter / B *************** Fin de JScript Commentaire ** / var winmgmts \u003d getObject ("Winmgmts: \\\\\\\\\\. \\\\ root \\\\ cimv2 "); var colprocess \u003d winmgmts.execquery ("Select * de win32_process"); Processes var \u003d nouvel énumérateur (ColProcess); pour (;! processus.tend (); processus.movenext ()) (var process \u003d processus.item (); wscript.echo (processus.processid + "+ processus.name);)

Ces deux paramètres peuvent être utilisés sur des machines sans liste de tâches.

La technique finale utilise MSHTA. Il fonctionnera sur toutes les machines Windows avec XP et ci-dessus et ne dépend pas de paramètres Windows scénario. L'appel MSHTA peut réduire légèrement les performances (encore une fois, vous devez économiser en tant que BAT):

@if (@x) \u003d\u003d (@ y) @end / * Jscript Commentaire ** @echo Off SetLocal si "% ~ 1" EQU "" Echo passe le nom du processus comme Forst Argument && sortie / B 1 :: Premier argument Est-ce que le processus que vous voulez vérifier si vous exécutez SET SET Process_To_Check \u003d% ~ 1 MSHTA »À propos de:"| Trouver / i"% Process_To_Check% "\u003e Nul 2\u003e & 1 && (ECHO Process% Process_To_Check% est en cours d'exécution) || (ECHO Process% Process_To_Check% n'est pas en cours d'exécution) Exit dedlocal / B ********* * ***** Fin de JScript Commentaire ** / var OFS \u003d Nouveau ActiveXObject ( "Scripting.FileSystemObject") Getstandardstream (1); var \u003d winmgmts GetObject ( "winmgmts:.. \\\\\\\\ \\\\ racine \\\\ CIMV2 "); var \u003d colprocess winmgmts.execquery (" select * from Win32_Process "); processus var \u003d new recenseur (colprocess), pour (;! processes.atend (); processes.movenext ()) (processus var \u003d processes.Item ); Fso.write (processus.processid + "" + processus.name + "\\ n");) fermer ();

La cloche.

Il y a ceux qui ont lu cette nouvelle devant vous.
Abonnez-vous pour recevoir des articles frais.
E-mail
Nom
Nom de famille
Comment voulez-vous lire la cloche
Sans spam