【问题标题】:How to get the script path of a python process who's cmdline is ["python"], with no path?如何获取cmdline为[“python”]的python进程的脚本路径,没有路径?
【发布时间】:2019-08-28 13:36:46
【问题描述】:

我正在尝试获取并杀死同一脚本的所有其他正在运行的 python 实例,当进程以 @987654327 启动时,我发现路径不在 psutilcmdline 列表中的边缘情况@ 而不是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进程不在psutilcmdline中时,如何获取它的脚本路径?

【问题讨论】:

    标签: python python-3.x unix shebang psutil


    【解决方案1】:

    当像这样调用 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']

    希望这会有所帮助。

    【讨论】:

    • 我认为您没有理解这个问题。我想从 psutil 进程实例中获取脚本路径。
    • 你是对的,刚刚发现了这一点,并在您编辑答案的同时撰写并发布了答案。
    【解决方案2】:

    当进程以./relative/or/absolute/path/to/script.py 而不是python /relative/or/absolute/path/to/script.py 启动时 psutil.Process.name()script.py 而不是 python

    【讨论】:

      【解决方案3】:

      要获取运行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}'
      

      解释:

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

      ! /psutil/ 匹配所有在路径中包含 psutil 的进程路径。

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

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

      {print} 输出匹配的行。

      【讨论】:

      • 我拒绝了你的问题编辑,它添加了 awk 标记并删除了 shebang 标记,因为这个问题更多的是关于 python 和 psutil(而不是 shell 脚本),一个 跨平台 库对于进程和系统监控,ps 和 awk 命令是特定于 unix 的。 shebang 标签是相关的,因为没有它,您将无法仅使用其路径运行脚本。
      猜你喜欢
      • 2012-11-10
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 2013-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多