GNU/Linux >> Tutoriels Linux >  >> Linux

Comment terminer le processus de Python en utilisant pid?

Je voulais faire la même chose que, mais je voulais le faire dans un seul fichier.

Donc la logique serait :

  • si un script portant mon nom est en cours d'exécution, tuez-le, puis quittez
  • si un script portant mon nom ne s'exécute pas, faites des choses

J'ai modifié la réponse de Bakuriu et j'ai trouvé ceci :

from os import getpid
from sys import argv, exit
import psutil  ## pip install psutil

myname = argv[0]
mypid = getpid()
for process in psutil.process_iter():
    if process.pid != mypid:
        for path in process.cmdline():
            if myname in path:
                print "process found"
                process.terminate()
                exit()

## your program starts here...

L'exécution du script fera tout ce que fait le script. L'exécution d'une autre instance du script tuera toute instance existante du script.

Je l'utilise pour afficher un petit widget de calendrier PyGTK qui s'exécute lorsque je clique sur l'horloge. Si je clique et que le calendrier n'est pas ouvert, le calendrier s'affiche. Si le calendrier est en cours d'exécution et que je clique sur l'horloge, le calendrier disparaît.


Utilisation du génial psutil bibliothèque c'est assez simple :

p = psutil.Process(pid)
p.terminate()  #or p.kill()

Si vous ne souhaitez pas installer une nouvelle bibliothèque, vous pouvez utiliser le os modules :

import os
import signal

os.kill(pid, signal.SIGTERM) #or signal.SIGKILL 

Voir aussi le os.kill documents.

Si vous souhaitez lancer la commande python StripCore.py s'il ne s'exécute pas et le tue sinon, vous pouvez utiliser psutil pour le faire de manière fiable.

Quelque chose comme :

import psutil
from subprocess import Popen

for process in psutil.process_iter():
    if process.cmdline() == ['python', 'StripCore.py']:
        print('Process found. Terminating it.')
        process.terminate()
        break
else:
    print('Process not found: starting it.')
    Popen(['python', 'StripCore.py'])

Exemple d'exécution :

$python test_strip.py   #test_strip.py contains the code above
Process not found: starting it.
$python test_strip.py 
Process found. Terminating it.
$python test_strip.py 
Process not found: starting it.
$killall python
$python test_strip.py 
Process not found: starting it.
$python test_strip.py 
Process found. Terminating it.
$python test_strip.py 
Process not found: starting it.

Remarque :Dans psutil précédent version cmdline était un attribut au lieu d'une méthode.


Linux
  1. Comment télécharger des fichiers à partir du serveur SFTP à l'aide d'un script python

  2. Comment identifier un processus qui n'a pas de PID ?

  3. Comment mettre à jour Python de 3.4.3 à 3.5 ??

  4. Comment tuer un processus sous Linux en utilisant la commande ?

  5. Comment terminer un sous-processus python lancé avec shell=True

Comment trouver un nom de processus à l'aide d'un numéro PID sous Linux

Comment copier des éléments d'une table DynamoDB vers une autre table DynamoDB à l'aide de Python sur AWS

Comment créer un compartiment S3 à l'aide de Python Boto3 sur AWS

Comment redimensionner des images à l'aide de Python

Comment mettre à niveau de 12.04 à 12.10 à l'aide d'un CD ?

Comment trouver le nom du processus à partir de son PID