有没有办法在Python中更改有效的进程名?

2024-05-19 20:12:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我可以更改Python脚本的有效进程名吗?当我得到系统进程列表时,我想显示一个不同的名称,而不是进程的真实名称。在C中我可以设置

strcpy(argv[0],"othername");

但在Python中

argv[0] = "othername"

好像没用。当我得到进程列表(在我的linux框中有ps ax)时,实名不会改变。如果有的话,我更喜欢一个可移植的解决方案(或者一个用于posix,另一个用于windows环境)。

提前谢谢


Tags: 脚本名称列表环境进程linuxwindows系统
3条回答

实际上,在linux上需要两件事:修改argv[0]from C(用于ps auxf和朋友)和使用PR_SET_NAME标志调用prctl

完全没有办法从python本身开始。不过,您可以通过调用prctl来更改进程名。

def set_proc_name(newname):
    from ctypes import cdll, byref, create_string_buffer
    libc = cdll.LoadLibrary('libc.so.6')
    buff = create_string_buffer(len(newname)+1)
    buff.value = newname
    libc.prctl(15, byref(buff), 0, 0, 0)

def get_proc_name():
    from ctypes import cdll, byref, create_string_buffer
    libc = cdll.LoadLibrary('libc.so.6')
    buff = create_string_buffer(128)
    # 16 == PR_GET_NAME from <linux/prctl.h>
    libc.prctl(16, byref(buff), 0, 0, 0)
    return buff.value

import sys
# sys.argv[0] == 'python'

# outputs 'python'
get_proc_name()

set_proc_name('testing yeah')

# outputs 'testing yeah'
get_proc_name()

ps auxf之后将只显示“python”:(。但是topps -A将显示新的“testing yeah”进程名:)。而且killallpkill将使用新名称。

顺便说一下,googlecode中的procname也会改变argv[0],因此,甚至会改变ps auxf输出。

更新:此答案中发布的解决方案有时在FreeBSD上效果不佳。我现在使用py-setproctitle声明的in this answer一年左右,在各种linux和freebsd框上。到目前为止还没有失败!每个人都应该!:). 它在其主数据库和子进程中使用的代码几乎与PostgreSQLuses相同。

我最近编写了一个Python模块来以可移植的方式更改进程标题:checkhttps://github.com/dvarrazzo/py-setproctitle

它是PostgreSQL用来执行标题更改的代码的包装器。它目前正在Linux和MacOSX上测试:Windows(功能有限)和BSD移植正在进行中。

编辑:自2010年7月起,该模块与BSD一起工作,在Windows上的功能有限,并已移植到Python3.x

简单地说,没有便携的方法。您必须测试系统并使用该系统的首选方法。

此外,我对Windows上进程名的含义感到困惑。

你是说服务名称吗?我想是的,因为没有其他东西是有意义的(至少对我的非视窗使用大脑)。

如果是,则需要使用Tim Golden's WMI interface并调用服务上的.Change方法。。。至少按照他的说法。

对于Linux,除了为您设置argv[0]的this poorly packaged module之外,我找到的所有方法都不起作用。

我甚至不知道这是否适用于BSD变体(它有一个setprocttitle系统调用)。我很肯定argv[0]在Solaris上不起作用。

相关问题 更多 >