我有一个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重命名这些进程,以便我可以将命令行参数作为进程名称的一部分包含在内,如果是这样,你会怎么做?
答案 0 :(得分:1)
如果你将kwarg executable
传递给subprocess.Popen
,你可以使用参数列表中的第一个参数:
subprocess.Popen(['some string you choose', str(p)],
executable=process_path+process_name, shell=False)
docs说:“在Unix上,它成为ps等实用程序中执行程序的显示名称。”
答案 1 :(得分:1)
setproctitle只能改变它的“自己的”进程标题,因为我会假设一个安全元素,但重写进程表的技术是一种古老的rootkit技术 - 所以显然它是可能的。
此外,setproctitle支持多个操作系统,因此更改进程信息的方法可能会有所不同,但为了便于解释,我假设你在Linux下使用它,让我们看看我们有什么。
Linux使用prctl(),看起来你使用prctl(PR_SET_NAME,“my_new_name”);,这只适用于调用进程。因此,使用setproctitle模块看起来并不像是一种“简单”的方法 - 你只能修改自己。
最好的办法是修改C ++代码,使其使用prctl。
如果您不使用Linux,请发布您正在使用的内容,因为其他操作系统提供的其他机会和方法与prctl的限制大不相同。
答案 2 :(得分:0)
仅限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应用程序来说,它稍微困难一些,而且不太可能是必要的。