La campana.

Ci sono quelli che hanno letto questa notizia prima di te.
Iscriviti per ricevere articoli freschi.
E-mail
Nome
Cognome
Come vuoi leggere la campana
Senza spam.

Mi piacciono gli strumenti WMIC e TaskList, ma non sono disponibili nelle edizioni della casa / principali di Windows. Un'utilizzo dei comandi QPROCESS disponibili su quasi tutte le finestre della macchina (per coloro che hanno servizi terminali - penso che solo la vittoria XP senza SP2, così praticamente ogni finestra della macchina):

@echo off: check_process setlocal se "% ~ 1" equ "" echo passare il nome del processo come Assst Argument && Exit / B 1 :: Primo argomento è il processo che si desidera controllare se Esecut Set Process_To_Check \u003d% ~ 1 :: qpRocess Può visualizzare solo i primi 12 simboli del processo di esecuzione: se è stato utilizzato un altro strumento, la linea seguente è possibile eliminare il set_to_check \u003d% process_to_check: ~ 0,12% QPROCESS * | Trova / I "% process_to_check%"\u003e nul 2\u003e

QpRocess. Il comando non è forte come tasklist ed è limitato nello spettacolo solo 12 caratteri del nome del processo, ma dovrebbe essere preso in considerazione se la lista delle applicazioni non è disponibile.

Più semplice da usare dove utilizza il nome se il processo è come argomento (suffisso.exe è obbligatorio in questo caso, quando si passa il nome del file eseguibile):

@echo off: check_process setlocal se "% ~ 1" equ "" echo passa il nome del processo come Assst Argument && Exit / B 1 :: Primo argomento è il processo che si desidera controllare se il suffisso di esecuzione :: .exe è un set obbligatorio " Process_to_check \u003d% ~ 1 "qprocess"% process_to_check% "\u003e nul 2\u003e & 1 && (echo process% processo_to_check% è in esecuzione) || (ECHO Process% Process_to_Check% non è in esecuzione) ENDLOCAL

La differenza tra due metodi di utilizzo QPROCESS di utilizzo che QPROCESS * elenca tutti i processi, mentre qpRocess Po.exe filtrarà solo i processi per utente attuale.

Usando oggetti WMI tramite Windows Script Host Exe invece di WMIC è anche un'opzione. Deve inoltre iniziare su tutte le macchine Windows (escluse quelle in cui è stato disattivato da WSH, ma questo è un caso raro). Il file è un pipistrello del file che elenca tutti i processi attraverso le classi WMI e possono essere utilizzati al posto di qpRocess in Lo script sopra (questo è un ibrido JScript / Bat Mouse e deve essere salvato come .bat):

@if (@x) \u003d\u003d (@ y) @end / * commento jscript ** @echo off cscript // e: jscript // nologo "% ~ f0" EXIT / B ********** **** Fine del commento jscript ** / var winmgmts \u003d getObject ("Winmgmts: \\\\\\\\. \\\\ root \\\\ cimv2"); var colprocess \u003d winmgmts.execquery ("Seleziona * da win32_process"); Processi var \u003d nuovo enumeratore (cocococess); per (;! processi.tend (); processi.Dovext ()) (var process \u003d processi.itEm (); wscript.echo (process.processid + "" + process.name);)

E una modifica che controllerà se il processo è stato lanciato:

@if (@x) \u003d\u003d (@ y) @end / * jscript commento ** @echo off se "% ~ 1" equ "" echo passare il nome del processo come Assst Argument && Exit / B 1 :: Primo argomento è Il processo che si desidera controllare se il set di esecuzione del processo_to_check \u003d% ~ 1 cscript // e: jscript // nologo "% ~ f0" | Trova / I "% process_to_check%"\u003e NUL 2\u003e & 1 && (ECHO Process% Process_To_Check% è in esecuzione) || (Echo Process% Process_to_Check% non è in funzione) EXIT / B *************** FINE DEL COMMENTO JSCLY ** / VER VINMGMTS \u003d GetObject ("WinMGMTS: \\\\\\\\. \\\\ root \\\\ cimv2 "); var colprocess \u003d winmgmts.execquery ("Seleziona * da win32_process"); Processi var \u003d nuovo enumeratore (cocococess); per (;! processi.tend (); processi.Dovext ()) (var process \u003d processi.itEm (); wscript.echo (process.processid + "" + process.name);)

due opzioni possono essere utilizzate su macchine che non hanno tasklist.

La tecnica finale è utilizzata da MSHTA. Lavorerà su tutte le macchine Windows con XP e sopra e non dipende dalle impostazioni. windows host. Script. La sfida MSHTA può ridurre un po 'sulle prestazioni, anche se (di nuovo dovrebbe essere salvata in BAT):

@if (@x) \u003d\u003d (@ y) @end / * jscript commento ** @echo off setlocal se "% ~ 1" equ "" echo pass il nome del processo come Assument && Exit / B 1 :: Primo argomento È il processo che desideri controllare se Esecuzione del set_t_Check \u003d% ~ 1 MSHTA "About:"| Trova / I"% process_to_Check% "\u003e NUL 2\u003e & 1 && (ECHO Process% Process_to_Check% è in esecuzione) || (Echo Process% Process_To_Check% non è in esecuzione) ENDLOCAL EXIT / B ******** * ***** Fine del commento jscripscript ** / var fso \u003d nuovo activexobject ("scripting.filesystemstemobject"). GetStandardstream (1); var winmgmts \u003d getObject ("winmgmts: \\\\\\\\. \\\\ root \\\\ cimv2 "); Var Colprocess \u003d winmgmts.execquery (" Seleziona * da Win32_Process "); Var Processes \u003d New Enumerator (ColpRocess); per (;! processi.atend (); processi.dovext ()) (Var Process \u003d Processi. ); Fso.write (process.processid + "" + process.name + "\\ n");) chiudi ();

Sto cercando di trovare se il processo si basa sull'identificatore del processo. Il codice sembra questo, in base a uno dei messaggi sul forum. Non riesco a considerare il nome del processo, dal momento che ci sono diversi processi che lavorano con lo stesso nome.

DEF FindProcess: PS \u003d subprocess.Popen ("PS -EF | GREP" + Processid, shell \u003d true, stdout \u003d subprocess.pipe) output \u003d ps.stdout.lead () ps.stdout.close () PS. Attendere () Uscita restituzione DEF ISPROCESROCESRUNING (ProcessID): Output \u003d FindProcessID (ProcessID) Ifput If Re.Search (ProcessID, Output) non è None: Restituisce true Else: Restituisci 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

Restituisce sempre TRUE, poiché può trovare l'ID del processo nella riga di uscita.

Eventuali suggerimenti? Grazie per qualsiasi aiuto.

11 Soluzioni Raccogli il modulo Web per "Verificare se il processo è in esecuzione in Python (in Linux / UNIX)"

Provare:

OS.KILL (PID, 0)

Devo avere successo (e non fare nulla) se il processo esiste o lanciare un'eccezione (che puoi prendere) se il processo non esiste.

La risposta più semplice, a mio parere (ALBIT, forse non perfetta), è cambiarlo

PS -EF |. Grep.

In modo da:

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

Ignorerà l'elenco dei processi per cercare un grep, contenente il processo PID che stai cercando di trovare.

Apparentemente, la risposta dell'utente9876 è molto più "pythic".

Questo è un piccolo kludge, ma su * Nix è possibile utilizzare OS.GetPGID (PID) o OS.KILL (PID, SIG) per verificare la disponibilità dell'ID del processo.

Importa OS DEF IS_PROCESS_RUNING (Process_ID): Prova: OS.KILL (Process_ID, 0) Restituisce True tranne OsError: return False

Modifica: Si prega di notare che OS.KILL funziona in Windows (con Python 2.7) e OS.GetPGID non sarà . Ma versione Windows Cause il TermineProcess (), che "inconfondizzi il processo incondizionatamente", quindi prevedo che non rimarrà in sicurezza le informazioni di cui hai bisogno, infatti senza uccidere il processo se esiste.

Se stai usando Windows, faccelo sapere, perché nessuna di queste soluzioni è accettabile in questo scenario.

Puoi controllare se c'è una cartella / proc /.

\u003e\u003e\u003e Importa os.path \u003e\u003e\u003e os.path.exists ("/ proc / 0") false \u003e\u003e\u003e os.path.exists ("/ proc / 12") true

Vedi questo: Come si controlla Linux con Python se il processo è ancora in esecuzione?

Se non ti dispiace usare un modulo esterno, suggerirei Psutil. È una piattaforma trasversale e facile da usare rispetto al sottomarino di spawn solo per cercare il processo corrente.

Se questo processo appartiene allo stesso utente, il processo di controllo, puoi semplicemente provarlo per uccidere. Se stai usando un 0, Kill non invierà nulla, ma ti farai ancora sapere se questo processo è disponibile.

Se SIG è 0, il segnale non viene inviato, ma il controllo degli errori è ancora eseguito; Questo può essere utilizzato per verificare la presenza di un ID di processo o identificatore del gruppo di processo.

Questo dovrebbe diffondersi in modo appropriato ai metodi Python.

So che è vecchio, ma l'ho usato e sembra funzionare; È possibile adattarsi rapidamente alla conversione dal nome del processo all'identificatore del processo:

Prova: se Len (OS.POPEN ("PS -AF | GREP -I" MyProcess "| GREP -V" GREP "| AWK" (stampa $ 3) ""). Leggi (). Strip (). \\ n "))\u003e 1: Raise SystemExit (0) tranne Eccezione, E: Aumentare E

In Windows, un'altra opzione è utilizzare TaskList.exe:

Sintassi: tasklist.exe / nh / fi "PID EQ Processid"

Def ISPROCEssRuning (Processid): PS \u003d subprocess.Popen (R "TaskList.exe / NH / Fi" PID EQ% D ""% (processid), shell \u003d true, stdout \u003d subprocess.pipe) output \u003d Ps.stdout.read () Ps.stdout.close () ps.wait () se processid in uscita: restituire il vero rendimento falso

È possibile utilizzare WMI in Windows.

Da Win32Com.Client Importa GetObject GetObject ("WinMGMTS:"). ExecQuery ("Seleziona * da Win32_Process dove processid \u003d" + STR (PID)). Conta

Puoi anche utilizzare altri filtri. Ad esempio, molto probabilmente voglio dire se il processo funziona per nome e si impegna. Ad esempio, se DBGView non è avviata, eseguilo.

Se non GetObject ("WinMGmts:"). ExecQuery ("Seleziona * da Win32_Process dove nome \u003d" dbgview.exe ""). Conteggio: subprocess.popen (R "C: \\ u \\ dbgview.exe", shell \u003d false)

Puoi anche risolvere e fare altre cose interessanti. Lista completa I campi sono qui.

Di recente ho dovuto elencare i processi attuali e quindi:

Def Check_Pecess (Processo): import re Import subprocess returnsprocess \u003d false s \u003d subprocess.popen (["PS", "AX"], stdout \u003d subprocess.pipe) per x in s.stdout: se re.search (processo, x ): Returnprocess \u003d true se returnprocess \u003d\u003d false: stampa "Nessuna esecuzione del processo" se ritorniProcess \u003d\u003d true: stampa "esecuzione del processo"

Devi trovarlo due volte.

pS -EF |. GREP 71676 |. SED "S / 71676 //" | GREP 71676.

Se restituisce vero, funziona davvero!

Mi piacciono gli strumenti WMIC e TaskList, ma non sono disponibili a casa / versioni principali di Windows. Un altro modo è usare il comando QPROCESS disponibile quasi tutte le macchine Windows (per quelle che hanno servizi terminal - penso che vinca solo XP senza SP2, così praticamente a tutti computer Windows):

@echo off: check_process setlocal se "% ~ 1" equ "" echo passare il nome del processo come Assst Argument && Exit / B 1 :: Primo argomento è il processo che si desidera controllare se Esecut Set Process_To_Check \u003d% ~ 1 :: qpRocess Può visualizzare solo i primi 12 simboli del processo di esecuzione: se è stato utilizzato un altro strumento, la linea seguente è possibile eliminare il set_to_check \u003d% process_to_check: ~ 0,12% QPROCESS * | Trova / I "% process_to_check%"\u003e nul 2\u003e

QpRocess. Il comando non è forte come tasklist ed è limitato alla visualizzazione solo di 12 caratteri il nome del processo, ma dovrebbe essere considerato se la tasklist non è disponibile.

Uso più semplice quando utilizza il nome se il processo è come argomento (suffisso.exe è obbligatorio in questo caso quando si passa il nome eseguibile):

@echo off: check_process setlocal se "% ~ 1" equ "" echo passa il nome del processo come Assst Argument && Exit / B 1 :: Primo argomento è il processo che si desidera controllare se il suffisso di esecuzione :: .exe è un set obbligatorio " Process_to_check \u003d% ~ 1 "qprocess"% process_to_check% "\u003e nul 2\u003e & 1 && (echo process% processo_to_check% è in esecuzione) || (ECHO Process% Process_to_Check% non è in esecuzione) ENDLOCAL

La differenza tra i due modi per utilizzare QPROCESS è che QPROCESS * visualizza tutti i processi e qpRocess po'.exe filtrarà solo i processi per l'utente corrente.

L'utilizzo di oggetti WMI attraverso l'host dello script Exe Windows anziché WMIC è anche un'opzione. Dovrebbe anche funzionare su tutte le macchine Windows (escluse quelle in cui è stato spento WSH, ma questo è un caso raro). Ecco il file BAT che elenca tutti i processi tramite lezioni WMI e possono essere utilizzate al posto di QPROCEss nello script sopra (questo è un JScript / Bat Hybrid e deve essere salvato come .bat):

@if (@x) \u003d\u003d (@ y) @end / * commento jscript ** @echo off cscript // e: jscript // nologo "% ~ f0" EXIT / B ********** **** Fine del commento jscript ** / var winmgmts \u003d getObject ("Winmgmts: \\\\\\\\. \\\\ root \\\\ cimv2"); var colprocess \u003d winmgmts.execquery ("Seleziona * da win32_process"); Processi var \u003d nuovo enumeratore (cocococess); per (;! processi.tend (); processi.Dovext ()) (var process \u003d processi.itEm (); wscript.echo (process.processid + "" + process.name);)

E una modifica che controllerà se il processo ha lanciato:

@if (@x) \u003d\u003d (@ y) @end / * jscript commento ** @echo off se "% ~ 1" equ "" echo passare il nome del processo come Assst Argument && Exit / B 1 :: Primo argomento è Il processo che si desidera controllare se il set di esecuzione del processo_to_check \u003d% ~ 1 cscript // e: jscript // nologo "% ~ f0" | Trova / I "% process_to_check%"\u003e NUL 2\u003e & 1 && (ECHO Process% Process_To_Check% è in esecuzione) || (Echo Process% Process_to_Check% non è in funzione) EXIT / B *************** FINE DEL COMMENTO JSCLY ** / VER VINMGMTS \u003d GetObject ("WinMGMTS: \\\\\\\\. \\\\ root \\\\ cimv2 "); var colprocess \u003d winmgmts.execquery ("Seleziona * da win32_process"); Processi var \u003d nuovo enumeratore (cocococess); per (;! processi.tend (); processi.Dovext ()) (var process \u003d processi.itEm (); wscript.echo (process.processid + "" + process.name);)

Questi due parametri possono essere utilizzati su macchine senza tasklist.

La tecnica finale utilizza MSHTA. Lavorerà su tutte le macchine Windows con XP e sopra e non dipende da impostazioni di Windows. Script. La chiamata MSHTA può ridurre leggermente le prestazioni (di nuovo è necessario salvare come BAT):

@if (@x) \u003d\u003d (@ y) @end / * jscript commento ** @echo off setlocal se "% ~ 1" equ "" echo pass il nome del processo come Assument && Exit / B 1 :: Primo argomento È il processo che desideri controllare se Esecuzione del set_t_Check \u003d% ~ 1 MSHTA "About:"| Trova / I"% process_to_Check% "\u003e NUL 2\u003e & 1 && (ECHO Process% Process_to_Check% è in esecuzione) || (Echo Process% Process_To_Check% non è in esecuzione) ENDLOCAL EXIT / B ******** * ***** Fine del commento jscripscript ** / var fso \u003d nuovo activexobject ("scripting.filesystemstemobject"). GetStandardstream (1); var winmgmts \u003d getObject ("winmgmts: \\\\\\\\. \\\\ root \\\\ cimv2 "); Var Colprocess \u003d winmgmts.execquery (" Seleziona * da Win32_Process "); Var Processes \u003d New Enumerator (ColpRocess); per (;! processi.atend (); processi.dovext ()) (Var Process \u003d Processi. ); Fso.write (process.processid + "" + process.name + "\\ n");) chiudi ();

La campana.

Ci sono quelli che hanno letto questa notizia prima di te.
Iscriviti per ricevere articoli freschi.
E-mail
Nome
Cognome
Come vuoi leggere la campana
Senza spam.