如何获取一个python进程的脚本路径谁是cmdline是[“python”],没有路径?

问题描述 投票:2回答:3

我试图获取并杀死同一个脚本的所有其他正在运行的python实例,我找到了一个边缘情况,其中路径不在psutilcmdline列表中,当进程启动时使用./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)

当它不在psutilcmdline中时,如何获得python进程的脚本路径?

python python-3.x unix shebang psutil
3个回答
2
投票

当调用这样的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
投票

当这个过程以./relative/or/absolute/path/to/script.py而不是python /relative/or/absolute/path/to/script.py开始时,psutil.Process.name()script.py而不是python


0
投票

要获取运行script.py的进程路径列表:

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

获取运行script.py的进程路径列表,路径中没有psutil。在以下脚本中替换您的script.pypsutil

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

explanation:

ps -eo pid,args列出所有进程,提供进程ID和进程路径(args)

! /psutil/匹配路径中没有psutil的所有进程路径。

&& /script.py/并匹配路径中具有script.py的所有进程路径。

&& $2 != "awk"并不想要这个awk进程。

{print}输出匹配的线。

© www.soinside.com 2019 - 2024. All rights reserved.