Existe-t-il un moyen de vérifier si un pid correspond à un processus valide? J'obtiens un pid d'une autre source que de os.getpid()
et je dois vérifier si un processus avec ce pid n'existe pas sur la machine.
J'en ai besoin pour être disponible sous Unix et Windows. Je vérifie également si le PID n'est PAS utilisé.
Réponses:
L'envoi du signal 0 à un pid lèvera une exception OSError si le pid n'est pas en cours d'exécution, et ne fera rien autrement.
la source
os.kill(pid, 0)
est le même que celuios.kill(pid, signal.CTRL_C_EVENT)
qui peut mettre fin au processus (ou échouer). J'obtiens unOSError
oùerrno==EINVAL
quand j'essaye ceci sur un sous-processus.Jetez un œil au
psutil
module:Il a une fonction appelée
pid_exists()
que vous pouvez utiliser pour vérifier si un processus avec le pid donné existe.Voici un exemple:
Pour référence:
la source
psutil
implémentepid_exists()
sur POSIX . Comparez avec la réponse de @Giampaolo Rodolà (auteur depsutil
)le code mluebke n'est pas correct à 100%; kill () peut également lever EPERM (accès refusé) auquel cas cela signifie évidemment qu'un processus existe. Ceci est censé fonctionner:
(édité selon les commentaires de Jason R. Coombs)
Vous ne pouvez pas faire cela sous Windows à moins d'utiliser pywin32, ctypes ou un module d'extension C. Si vous êtes d'accord avec le fait de dépendre d'une bibliothèque externe, vous pouvez utiliser psutil :
la source
Les réponses impliquant l'envoi du «signal 0» au processus ne fonctionneront que si le processus en question appartient à l'utilisateur exécutant le test . Sinon, vous obtiendrez un
OSError
dû aux autorisations , même si le pid existe dans le système.Afin de contourner cette limitation, vous pouvez vérifier si elle
/proc/<pid>
existe:Ceci s'applique aux systèmes Linux uniquement, évidemment.
la source
PermissionError
signifie que pid existe , vous obtenezProcessLookupError
si pid n'existe pas.OSError
raison de l'autorisation refusée peut être différenciée des autres - soit en regardant errno, soit en capturant les exceptionsPermissionError
/ProcessLookupError
exceptions plus spécialisées qui en découlentOSError
. De plus, vous n'obtenez l'erreur d'autorisation que si le processus existe. Ainsi, votre exemple n'est qu'une méthode alternative qui fonctionne sur Linux et certains autres Unices, mais ce n'est pas plus complet que d'appeler correctementos.kill(pid, 0)
./proc
procfs ne se ferme que sous Linux, pas même sous BSD ou OSX.Dans Python 3.3+, vous pouvez utiliser des noms d'exception au lieu de constantes errno. Version Posix :
la source
Recherchez ici un moyen spécifique à Windows d'obtenir la liste complète des processus en cours d'exécution avec leurs ID. Ce serait quelque chose comme
Vous pouvez ensuite vérifier le pid obtenu par rapport à cette liste. Je n'ai aucune idée du coût des performances, vous feriez donc mieux de vérifier cela si vous prévoyez d'effectuer souvent une vérification pid.
Pour * NIx, utilisez simplement la solution de mluebke.
la source
En m'appuyant sur ntrrgc, j'ai renforcé la version Windows afin qu'elle vérifie le code de sortie du processus et vérifie les autorisations:
la source
GetExistCodeProcess
nécessite les droits d'accèsPROCESS_QUERY_INFORMATION
etPROCESS_QUERY_LIMITED_INFORMATION
.GetExitCodeProcess
reçoit une poignée et un pointeur et dans cet exemple, il reçoit uneExitCodeProcess
structure comme deuxième paramètre alors qu'il ne devrait s'agir que d'un pointeur.En combinant la réponse de Giampaolo Rodolà pour POSIX et la mienne pour Windows, j'ai obtenu ceci:
la source
GetExitCodeProcess
et vous assurer que vous avez même accès.kernel32.OpenProcess
uniquement ne suffit pas. Comme indiqué ici "si le processus s'est arrêté récemment, un pid peut encore exister pour le handle." Sikernel32.OpenProcess
retourne une valeur non nulle, nous devonskernel32.GetExitCodeProcess
encore vérifier le code de sortie.Sous Windows, vous pouvez le faire de cette manière:
Tout d'abord, dans ce code, vous essayez d'obtenir une poignée pour le processus avec pid donné. Si le handle est valide, fermez le handle du processus et renvoyez True; sinon, vous retournez False. Documentation pour OpenProcess: https://msdn.microsoft.com/en-us/library/windows/desktop/ms684320%28v=vs.85%29.aspx
la source
Cela fonctionnera pour Linux, par exemple si vous voulez vérifier si banshee est en cours d'exécution ... (banshee est un lecteur de musique)
la source
os.kill(pid, 0)
ou à la visualisation/proc/{pid}
. Au lieu d'exécuter un appel système, votre code forque un enfant, exécute un shell dans cet enfant, le shell interprète votre mini-script shell superflu, le shell forge un autre enfant qui exécute pgrep et enfin pgrep itère/proc
. Votre réponse ne répond pas à la question posée. Le PO a demandé une méthode avec un PID. Votre méthode nécessite un nom de processus.Le code suivant fonctionne à la fois sous Linux et Windows, et ne dépend pas des modules externes
Il peut être facilement amélioré au cas où vous auriez besoin
la source
Je dirais que vous utilisez le PID dans tous les cas où vous l'obtenez et gérez les erreurs avec élégance. Sinon, c'est une course classique (le PID peut être valide lorsque vous le vérifiez, mais disparaît un instant plus tard)
la source