GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo terminar el proceso desde Python usando pid?

Quería hacer lo mismo que, pero quería hacerlo en un archivo.

Entonces la lógica sería:

  • si se está ejecutando un script con mi nombre, elimínelo y luego salga
  • si no se está ejecutando un script con mi nombre, haga algo

Modifiqué la respuesta de Bakuriu y se me ocurrió esto:

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

Ejecutar el script hará lo que haga el script. Ejecutar otra instancia del script eliminará cualquier instancia existente del script.

Lo uso para mostrar un pequeño widget de calendario PyGTK que se ejecuta cuando hago clic en el reloj. Si hago clic y el calendario no está activo, se muestra el calendario. Si el calendario se está ejecutando y hago clic en el reloj, el calendario desaparece.


Usando el asombroso psutil biblioteca es bastante simple:

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

Si no desea instalar una nueva biblioteca, puede usar el os módulo:

import os
import signal

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

Véase también el os.kill documentación.

Si está interesado en iniciar el comando python StripCore.py si no se está ejecutando y, de lo contrario, lo mata, puede usar psutil para hacer esto de manera confiable.

Algo como:

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

Ejecución de muestra:

$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 :En el anterior psutil versiones cmdline era un atributo en lugar de un método.


Linux
  1. ¿Cómo identificar un proceso que no tiene Pid?

  2. ¿Cómo matar un proceso en Linux usando el comando?

  3. Cómo finalizar un subproceso de python iniciado con shell=True

  4. ¿Cómo obtener el PID principal de un proceso determinado en GNU/Linux desde la línea de comandos?

  5. Cómo obtener pid del proceso recién iniciado

Cómo encontrar un nombre de proceso usando el número PID en Linux

Cómo copiar elementos de un DynamoDB a otra tabla de DynamoDB usando Python en AWS

Cómo crear un depósito S3 usando Python Boto3 en AWS

Cómo cambiar el tamaño de las imágenes usando Python

¿Cómo actualizar de 12.04 a 12.10 usando Cd?

Cómo encontrar el nombre del proceso a partir de su PID