【问题标题】:Python: Changing process name with setproctitlePython:使用 setproctitle 更改进程名称
【发布时间】:2010-08-23 14:04:55
【问题描述】:

我有一个 python 脚本,它启动了许多 C++ 程序,每个程序都传递了一个命令行参数,如下所示

process_path "~/test/"
process_name "test"
num_process = 10

for p in range(1, num_processes, 1):
    subprocess.Popen([process_path + process_name, str(p)], shell = False)

我们是否可以通过 setproctitle 重命名这些进程中的每一个,以便我可以将命令行参数作为进程名称的一部分包含在内,如果可以,您会怎么做?

【问题讨论】:

  • AFAIK, setproctitle 只能被进程用来改变自己的标题,不能改变另一个进程的标题。所以C++程序必须自己调用setproctitle
  • 好吧,其他一些创造性的解决方案可能仍然是可能的......

标签: python process


【解决方案1】:

setproctitle 只能更改它的“自己的”进程标题,因为我认为这是一个安全元素,但重写进程表的技术是一种古老的 rootkit 技术——显然这是可能的。

此外,setproctitle 支持多个操作系统,因此您更改进程信息的方法可能会有所不同,但为了解释起见,我假设您在 Linux 下使用它,让我们看看我们有什么。

Linux 使用 prctl(),看起来你使用 prctl(PR_SET_NAME, "my_new_name");,这仅适用于调用进程。因此,使用 setproctitle 模块似乎没有一种“简单”的方法可以做到这一点——你只能自己修改。

最好的办法是修改 C++ 代码,使其使用 prctl。

如果您不使用 Linux,请发布您正在使用的内容,因为其他操作系统提供的其他机会和方法与 prctl 的限制有很大不同。

【讨论】:

    【解决方案2】:

    如果您将 kwarg executable 传递给 subprocess.Popen,则可以使用参数列表中的第一个参数:

    subprocess.Popen(['some string you choose', str(p)],
                     executable=process_path+process_name, shell=False)
    

    docs 说:“在 Unix 上,它成为 ps 等实用程序中正在执行的程序的显示名称。”

    【讨论】:

    • 这似乎对我不起作用(Ubuntu)。它对你有用吗?
    【解决方案3】:

    仅限 Windows:进程名称通常表示正在运行的实际可执行映像(例如 calc.exe)。另一方面,可以使用 start 命令轻松更改控制台 (CUI) 应用程序的进程标题(它是显示在任务栏上的文本),而不是直接运行应用程序(将标题作为第一个参数;使用 start / ? 了解详情):

    for p in range(1, num_processes, 1):
        subprocess.Popen(['start', str(p), process_path + process_name, str(p)], shell = False)
        #                            ^ this is the title
    

    对于 GUI 应用程序来说,它稍微有点困难,而且不太可能是必要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-16
      • 2011-08-30
      • 2019-07-14
      • 1970-01-01
      • 2012-02-18
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多