LA CAMPANA

C'è chi ha letto questa notizia prima di te.
Iscriviti per ricevere gli ultimi articoli.
E-mail
Nome
Cognome
Ti piacerebbe leggere The Bell
Niente spam

Mi piacciono gli strumenti WMIC e TASKLIST, ma non sono disponibili nelle edizioni home/principali di Windows.Un altro modo è usare i comandi QPROCESS disponibili su quasi tutte le macchine Windows (per quelli che hanno servizi terminal - penso che vinci solo XP senza SP2 , quindi praticamente ogni macchina per finestre):

@echo off:check_process setlocal if "%~1" equ "" echo passa il nome del processo come primo argomento && exit /b 1:: il primo argomento è il processo che vuoi verificare se è in esecuzione set process_to_check=%~1:: QPROCESS può visualizzare solo i primi 12 simboli del processo in esecuzione:: Se viene utilizzato un altro strumento, la riga seguente potrebbe essere cancellata set process_to_check=%process_to_check:~0.12% QPROCESS * | find /i "%process_to_check%" >nul 2>

QPROCESSO il comando non è potente come TASKLIST ed è limitato a visualizzare solo 12 caratteri del nome del processo, ma dovrebbe essere preso in considerazione se TASKLIST non è disponibile.

Un utilizzo più semplice in cui utilizza il nome if process come argomento (il suffisso .exe è richiesto in questo caso quando si passa il nome file eseguibile):

@echo off:check_process setlocal if "%~1" equ "" echo passa il nome del processo come primo argomento && exit /b 1:: il primo argomento è il processo che vuoi controllare se l'esecuzione:: il suffisso .exe è obbligatorio set " process_to_check=%~1" QPROCESS "%process_to_check%" >nul 2>&1 && (echo processo %process_to_check% è in esecuzione) || (il processo echo %process_to_check% non è in esecuzione) endlocal

La differenza tra i due modi di utilizzare QPROCESS è che QPROCESS * elenca tutti i processi mentre QPROCESS some.exe filtrerà solo i processi per utente attuale.

Anche l'utilizzo di oggetti WMI tramite Windows script host exe invece di WMIC è un'opzione. Dovrebbe funzionare anche su tutti Macchine Windows(esclusi quelli in cui WSH è disabilitato, ma questo è un caso raro).Ecco un file bat che elenca tutti i processi tramite le classi WMI e può essere utilizzato al posto di QPROCESS nello script sopra (questo è un ibrido JScript/BAT e dovrebbe essere salvato come .bat ):

@if (@X)==(@Y) @end /* COMMENTO JSCRIPT ** @echo off cscript //E:JScript //nologo "%~f0" exit /b ********** **** fine del COMMENTO JSCRIPT **/ var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2"); var colProcess = winmgmts.ExecQuery("Seleziona * da Win32_Process"); var processi = new Enumerator(colProcess); for (;!processes.atEnd();processes.moveNext()) ( var process=processes.item(); WScript.Echo(process.processID + " " + process.Name); )

E una modifica che verificherà se il processo è in esecuzione:

@if (@X)==(@Y) @end /* COMMENTO JSCRIPT ** @echo off if "%~1" equ "" echo passa il nome del processo come primo argomento && exit /b 1:: il primo argomento è il processo che vuoi controllare se è in esecuzione set process_to_check=%~1 cscript //E:JScript //nologo "%~f0" | find /i "%process_to_check%" >nul 2>&1 && (il processo echo %process_to_check% è in esecuzione) || (il processo echo %process_to_check% non è in esecuzione) exit /b ************** end of JSCRIPT COMMENT **/ var winmgmts = GetObject("winmgmts:\\\\.\\root \\cimv2"); var colProcess = winmgmts.ExecQuery("Seleziona * da Win32_Process"); var processi = new Enumerator(colProcess); for (;!processes.atEnd();processes.moveNext()) ( var process=processes.item(); WScript.Echo(process.processID + " " + process.Name); )

due opzioni possono essere utilizzate su macchine che non hanno un TASKLIST .

La tecnica finale è utilizzata da MSHTA. Funzionerà su tutte le macchine Windows da XP e versioni successive ed è indipendente dalle impostazioni Host Windows Sceneggiatura. la chiamata MSHTA potrebbe tuttavia ridurre leggermente le prestazioni (di nuovo dovrebbe essere salvata in bat):

@if (@X)==(@Y) @end /* COMMENTO JSCRIPT ** @echo off setlocal if "%~1" equ "" echo passa il nome del processo come primo argomento && exit /b 1:: primo argomento è il processo che vuoi controllare se stai eseguendo set process_to_check=%~1 mshta "about:" | trova /i "%process_to_check%" >nul 2>&1 && (il processo echo %process_to_check% è in esecuzione) || (il processo echo %process_to_check% non è in esecuzione) endlocal exit /b ********* ***** fine del COMMENTO JSCRIPT **/ var fso= new ActiveXObject("Scripting.FileSystemObject").GetStandardStream(1); var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2" ); var colProcess = winmgmts.ExecQuery("Seleziona * da Win32_Process"); var processi = new Enumerator(colProcess); for (;!processes.atEnd();processes.moveNext()) ( var process=processes.item( ); fso.Write(process.processID + " " + process.Name + "\n"); ) close();

Sto cercando di scoprire se un processo è in esecuzione in base all'ID processo. Il codice ha questo aspetto, basato su uno dei post del forum. Non riesco a visualizzare il nome del processo in quanto vi sono più processi in esecuzione con lo stesso nome.

Def findProcess(processId): ps= subprocess.Popen("ps -ef | grep "+processId, shell=True, stdout=subprocess.PIPE) output = ps.stdout.read() ps.stdout.close() ps. wait() restituisce output def isProcessRunning(processId): output = findProcess(processId) if re.search(processId, output) is None: restituisce true else: return False 1111 72312 72311 0 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 perché può trovare l'id del processo nella stringa di output.

Eventuali suggerimenti? Grazie per qualsiasi aiuto.

11 Soluzioni raccogliere modulo web per "Controllare se un processo è in esecuzione in Python (su Linux/Unix)"

Tentativo:

os.kill(pid, 0)

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

La risposta più semplice secondo me (anche se forse non ideale) è cambiare

Sal -ef | grep

In modo da:

Sal -ef | grep | grep -v grep

Ciò ignorerà l'elenco di ricerca grep dei processi contenente il PID del processo che stai cercando di trovare.

Apparentemente la risposta di user9876 è molto più "Pythonic".

È un po' complicato, ma su *nix puoi usare os.getpgid(pid) o os.kill(pid, sig) per verificare la presenza di un id di processo.

Import os def is_process_running(process_id): try: os.kill(process_id, 0) return True tranne OSError: return False

EDIT: Si prega di notare che os.kill funziona su Windows (a partire da Python 2.7) mentre os.getpgid non lo farà . Ma Versione Windows chiama TerminateProcess() che "forzerà incondizionatamente l'uscita del processo", quindi prevedo che non restituirà in modo sicuro le informazioni necessarie senza effettivamente uccidere il processo se esiste.

Se utilizzi Windows, comunicacelo perché nessuna di queste soluzioni è accettabile in questo scenario.

Puoi verificare se la cartella /proc/ esiste.

>>> import os.path >>> os.path.exists("/proc/0") False >>> os.path.exists("/proc/12") True

Vedi quindi: come si controlla Linux con Python se un processo è ancora in esecuzione?

Se non ti dispiace usare un modulo esterno, suggerirei psutil . È multipiattaforma e più facile da usare rispetto alla generazione di una subshell solo allo scopo di trovare il processo corrente.

Se questo processo è di proprietà dello stesso utente, controlla il processo, puoi semplicemente provare a ucciderlo. Se usi il segnale 0, kill non invierà nulla, ma ti farà comunque sapere se il processo è disponibile.

Se sig è 0, non viene inviato alcun segnale, ma viene comunque eseguito il controllo degli errori; questo può essere utilizzato per verificare la presenza di un ID di processo o di un ID di gruppo di processi.

Questo dovrebbe propagarsi ai metodi Python in modo appropriato.

So che è vecchio ma l'ho usato e sembra funzionare; puoi adattarti rapidamente alla conversione dal nome del processo all'id del processo:

Prova: if len(os.popen("ps -aef | grep -i "myprocess" | grep -v "grep" | awk "( print $3 )"").read().strip().split("\ n")) > 1: aumenta SystemExit(0) tranne Eccezione, e: aumenta e

Su Windows, un'altra opzione è usare tasklist.exe:

Sintassi: 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() se processId in output: return True return False

Su Windows, puoi utilizzare WMI.

Da win32com.client import GetObject GetObject("winmgmts:").ExecQuery("Select * from Win32_Process where ProcessId = " + str(pid)).count

Puoi anche usare altri filtri. Ad esempio, molto probabilmente voglio solo dire se un processo è in esecuzione per nome e agire. Ad esempio, se DbgView non è in esecuzione, avvialo.

If not GetObject("winmgmts:").ExecQuery("Select * from Win32_Process where Name = "dbgview.exe"").count: subprocess.Popen(r"C:\U\dbgview.exe", shell=False)

Puoi anche iterare e fare altre cose interessanti. Lista completa campi è qui.

Recentemente ho dovuto elencare i processi in corso e quindi:

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 if returnprocess == False: print "nessun processo in esecuzione" if returnprocess == True: print "processo in esecuzione"

Devi trovarlo due volte.

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

Se restituisce True allora funziona davvero!

Mi piacciono gli strumenti WMIC e TASKLIST, ma non sono disponibili nelle versioni home/master di Windows. Un altro modo è utilizzare il comando QPROCESS, disponibile su quasi tutte le macchine Windows (per quelle che dispongono di servizi terminal - penso che vincano solo XP senza SP2, quindi praticamente ogni Computer Windows):

@echo off:check_process setlocal if "%~1" equ "" echo passa il nome del processo come primo argomento && exit /b 1:: il primo argomento è il processo che vuoi verificare se è in esecuzione set process_to_check=%~1:: QPROCESS può visualizzare solo i primi 12 simboli del processo in esecuzione:: Se viene utilizzato un altro strumento, la riga seguente potrebbe essere cancellata set process_to_check=%process_to_check:~0.12% QPROCESS * | find /i "%process_to_check%" >nul 2>

QPROCESSO Il comando non è potente come TASKLIST ed è limitato alla visualizzazione di soli 12 caratteri del nome del processo, ma dovrebbe essere considerato se TASKLIST non è disponibile.

Un utilizzo più semplice è quando utilizza il nome del processo if come argomento (il suffisso .exe è obbligatorio in questo caso quando si passa il nome dell'eseguibile):

@echo off:check_process setlocal if "%~1" equ "" echo passa il nome del processo come primo argomento && exit /b 1:: il primo argomento è il processo che vuoi controllare se l'esecuzione:: il suffisso .exe è obbligatorio set " process_to_check=%~1" QPROCESS "%process_to_check%" >nul 2>&1 && (echo processo %process_to_check% è in esecuzione) || (il processo echo %process_to_check% non è in esecuzione) endlocal

La differenza tra i due modi di utilizzare QPROCESS è che QPROCESS * elencherà tutti i processi, mentre QPROCESS some.exe filtrerà solo i processi per l'utente corrente.

Anche l'utilizzo di oggetti WMI tramite Windows script host exe invece di WMIC è un'opzione. Dovrebbe funzionare anche su tutte le macchine Windows (escluse quelle con WSH disabilitato, ma questo è raro). Ecco un file bat che elenca tutti i processi tramite le classi WMI e può essere utilizzato al posto di QPROCESS nello script sopra (questo è un ibrido jscript/bat e dovrebbe essere salvato come .bat):

@if (@X)==(@Y) @end /* COMMENTO JSCRIPT ** @echo off cscript //E:JScript //nologo "%~f0" exit /b ********** **** fine del COMMENTO JSCRIPT **/ var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2"); var colProcess = winmgmts.ExecQuery("Seleziona * da Win32_Process"); var processi = new Enumerator(colProcess); for (;!processes.atEnd();processes.moveNext()) ( var process=processes.item(); WScript.Echo(process.processID + " " + process.Name); )

E una modifica che verificherà se il processo è in esecuzione:

@if (@X)==(@Y) @end /* COMMENTO JSCRIPT ** @echo off if "%~1" equ "" echo passa il nome del processo come primo argomento && exit /b 1:: il primo argomento è il processo che vuoi controllare se è in esecuzione set process_to_check=%~1 cscript //E:JScript //nologo "%~f0" | find /i "%process_to_check%" >nul 2>&1 && (il processo echo %process_to_check% è in esecuzione) || (il processo echo %process_to_check% non è in esecuzione) exit /b ************** end of JSCRIPT COMMENT **/ var winmgmts = GetObject("winmgmts:\\\\.\\root \\cimv2"); var colProcess = winmgmts.ExecQuery("Seleziona * da Win32_Process"); var processi = new Enumerator(colProcess); for (;!processes.atEnd();processes.moveNext()) ( var process=processes.item(); WScript.Echo(process.processID + " " + process.Name); )

Queste due opzioni possono essere utilizzate su macchine senza TASKLIST .

La tecnica finale utilizza MSHTA . Funzionerà su tutte le macchine Windows da XP e versioni successive ed è indipendente da Impostazioni di Windows copione. chiamare MSHTA potrebbe degradare leggermente le prestazioni (di nuovo, è necessario salvare come bat):

@if (@X)==(@Y) @end /* COMMENTO JSCRIPT ** @echo off setlocal if "%~1" equ "" echo passa il nome del processo come primo argomento && exit /b 1:: primo argomento è il processo che vuoi controllare se stai eseguendo set process_to_check=%~1 mshta "about:" | trova /i "%process_to_check%" >nul 2>&1 && (il processo echo %process_to_check% è in esecuzione) || (il processo echo %process_to_check% non è in esecuzione) endlocal exit /b ********* ***** fine del COMMENTO JSCRIPT **/ var fso= new ActiveXObject("Scripting.FileSystemObject").GetStandardStream(1); var winmgmts = GetObject("winmgmts:\\\\.\\root\\cimv2" ); var colProcess = winmgmts.ExecQuery("Seleziona * da Win32_Process"); var processi = new Enumerator(colProcess); for (;!processes.atEnd();processes.moveNext()) ( var process=processes.item( ); fso.Write(process.processID + " " + process.Name + "\n"); ) close();

LA CAMPANA

C'è chi ha letto questa notizia prima di te.
Iscriviti per ricevere gli ultimi articoli.
E-mail
Nome
Cognome
Ti piacerebbe leggere The Bell
Niente spam