GNU/Linux >> Linux Esercitazione >  >> Linux

Come terminare il processo da Python usando pid?

Volevo fare la stessa cosa di, ma volevo farlo in un unico file.

Quindi la logica sarebbe:

  • se è in esecuzione uno script con il mio nome, terminalo, quindi esci
  • se uno script con il mio nome non è in esecuzione, fai qualcosa

Ho modificato la risposta di Bakuriu e ho ottenuto questo:

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'esecuzione dello script farà qualunque cosa faccia lo script. L'esecuzione di un'altra istanza dello script interromperà qualsiasi istanza esistente dello script.

Lo uso per visualizzare un piccolo widget del calendario PyGTK che viene eseguito quando faccio clic sull'orologio. Se faccio clic e il calendario non è attivo, viene visualizzato il calendario. Se il calendario è in esecuzione e faccio clic sull'orologio, il calendario scompare.


Usando il fantastico psutil library è piuttosto semplice:

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

Se non vuoi installare una nuova libreria, puoi usare os modulo:

import os
import signal

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

Vedi anche il os.kill documentazione.

Se sei interessato ad avviare il comando python StripCore.py se non è in esecuzione e altrimenti lo uccide, puoi usare psutil per farlo in modo affidabile.

Qualcosa come:

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'])

Esempio di esecuzione:

$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.

Nota :Nel precedente psutil versioni cmdline era un attributo invece di un metodo.


Linux
  1. Come scaricare file dal server SFTP utilizzando lo script python

  2. Come identificare un processo che non ha Pid?

  3. Come terminare un sottoprocesso Python avviato con shell=True

  4. Come ottenere il PID dal processo figlio biforcuto nello script della shell

  5. Come ottenere il pid del processo appena avviato

Come trovare un nome di processo utilizzando il numero PID in Linux

Come copiare elementi da un DynamoDB a un'altra tabella DynamoDB utilizzando Python su AWS

Come creare un bucket S3 utilizzando Python Boto3 su AWS

Come ridimensionare le immagini usando Python

Come aggiornare da 12.04 a 12.10 utilizzando Cd?

Come trovare il nome del processo dal suo PID