Python:使用setproctitle更改进程名称
我有一个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来给每个进程重命名,这样我就可以把命令行参数包含在进程名称里?如果可以的话,应该怎么做呢?
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)应用程序来说,这稍微复杂一些,而且通常不太需要这样做。
如果你在调用 subprocess.Popen
时传入一个叫 executable
的参数,你可以在参数列表的第一个位置使用这个参数:
subprocess.Popen(['some string you choose', str(p)],
executable=process_path+process_name, shell=False)
文档上说:“在Unix系统上,它会成为执行程序在一些工具(比如ps)中的显示名称。”
setproctitle 这个东西只能改变它“自己”的进程标题,我猜这是出于安全考虑。不过,重写进程表的技术其实是个古老的黑客手法,所以显然这是可行的。
而且,setproctitle 支持多种操作系统,所以改变进程信息的方法可能会有所不同。不过为了方便解释,我假设你是在 Linux 系统下使用这个,我们来看看具体情况。
在 Linux 中,可以使用 prctl(),用法看起来像这样:prctl(PR_SET_NAME, "my_new_name"); 这样做只对调用这个函数的进程有效。所以,使用 setproctitle 模块似乎没有“简单”的方法来做到这一点——你只能修改你自己。
最好的办法是修改你的 C++ 代码,让它使用 prctl。
如果你不是在用 Linux,请告诉我你用的是什么系统,因为其他操作系统提供了不同的机会和方法,这些方法和 prctl 的限制差别很大。