¿Cómo obtener la ruta del script de un proceso de python cuya línea de comandos de cmthline es , sin ruta?

Estoy intentando obtener y eliminar todas las demás instancias de python en ejecución del mismo script, encontré un caso de borde en el que la ruta no está en la lista de línea de cmdline , cuando el proceso se inicia con ./myscript.py y no con python ./myscript.py

El contenido del script es, note el shebang:

 #!/bin/python import os import psutil import sys import time for proc in psutil.process_iter(): if "python" in proc.name(): print("name", proc.name()) script_path = sys.argv[0] proc_script_path = sys.argv[0] if len(proc.cmdline()) > 1: proc_script_path = proc.cmdline()[1] else: print("there's no path in cmdline") if script_path.startswith("." + os.sep) or script_path.startswith(".." + os.sep): script_path = os.path.normpath(os.path.join(os.getcwd(), script_path)) if proc_script_path.startswith("." + os.sep) or proc_script_path.startswith(".." + os.sep): proc_script_path = os.path.normpath(os.path.join(proc.cwd(), proc_script_path)) print("script_path", script_path) print("proc_script_path", proc_script_path) print("my pid", os.getpid()) print("other pid", proc.pid) if script_path == proc_script_path and os.getpid() != proc.pid: print("terminating instance ", proc.pid) proc.kill() time.sleep(300) 

¿Cómo puedo obtener la ruta de comandos de un proceso de python cuando no está en el psutil de cmdline ?

Cuando se invoca una secuencia de comandos de python como esta, el problema es verificar if 'python' in proc.name() es el problema. Esto no mostrará python o python3 para los scripts en cuestión, pero mostrará el nombre del script. Intente lo siguiente:

 import psutil for proc in proc.process_iter(): print('Script name: {}, cmdline: {}'.format(proc.name(), proc.cmdline())) 

Debería ver algo como (): Script name: myscript.py, cmdline: ['/usr/bin/python3', './myscript.py']

Espero que esto ayude.

cuando el proceso se inicia con ./relative/or/absolute/path/to/script.py y no python /relative/or/absolute/path/to/script.py el psutil.Process.name() es script.py y no python .

Para obtener la lista de rutas de proceso que ejecutan su script.py :

  ps -eo pid,args|awk '/script.py/ && $2 != "awk" {print}' 

Para obtener la lista de rutas de proceso que ejecutan su script.py no tiene psutil en la ruta. Reemplace su script.py y psutil en el siguiente script.

  ps -eo pid,args|awk '! /psutil/ && /script.py/ && $2 != "awk" {print}' 

explicación:

ps -eo pid,args enumera todos los procesos, proporcionando la ID del proceso y la ruta del proceso (args)

! /psutil/ ! /psutil/ empareja todas las rutas de proceso que no tienen psutil en la ruta.

&& /script.py/ y && /script.py/ coincidir todas las rutas de proceso que tienen script.py en la ruta.

&& $2 != "awk" y no querer este proceso awk.

{print} muestra las líneas coincidentes.