Как получить путь к сценарию процесса Python, который называется ["python"] без указания пути? - PullRequest
2 голосов
/ 07 апреля 2019

Я пытаюсь получить и уничтожить все остальные запущенные экземпляры Python того же скрипта, я нашел крайний случай, когда путь не в psutil 'cmdline список, когда процесс запускается с ./myscript.py, а не python ./myscript.py

содержимое сценария, обратите внимание на 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)

как я могу получить путь к сценариюпроцесс Python, когда он не находится в psutil cmdline?

Ответы [ 3 ]

2 голосов
/ 07 апреля 2019

При вызове скрипта Python, подобного этому, проверка if 'python' in proc.name() является проблемой. Это не будет отображать python или python3 для рассматриваемых сценариев, но будет отображать имя сценария. Попробуйте следующее:

import psutil

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

Вы должны увидеть что-то вроде (): Script name: myscript.py, cmdline: ['/usr/bin/python3', './myscript.py']

Надеюсь, это поможет.

1 голос
/ 07 апреля 2019

, когда процесс начинается с ./relative/or/absolute/path/to/script.py, а не python /relative/or/absolute/path/to/script.py, psutil.Process.name() равен script.py, а не python.

0 голосов
/ 09 апреля 2019

Чтобы получить список путей процессов, на которых запущен ваш script.py:

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

Чтобы получить список путей процессов, на которых запущен ваш script.py без psutil в пути.Замените ваши script.py и psutil в следующем сценарии.

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

пояснение:

ps -eo pid,args список всех процессов с указанием идентификатора процесса и пути процесса (аргументы)

! /psutil/ соответствует всем путям процесса не с psutil в пути.

&& /script.py/ и соответствует всем путям процесса, имеющим script.py в пути.

&& $2 != "awk" и не требуется этот процесс awk.

{print} выводит совпавшие строки.

...