2024-05-19 20:12:23 发布
网友
我可以更改Python脚本的有效进程名吗?当我得到系统进程列表时,我想显示一个不同的名称,而不是进程的真实名称。在C中我可以设置
strcpy(argv[0],"othername");
但在Python中
argv[0] = "othername"
好像没用。当我得到进程列表(在我的linux框中有ps ax)时,实名不会改变。如果有的话,我更喜欢一个可移植的解决方案(或者一个用于posix,另一个用于windows环境)。
ps ax
提前谢谢
实际上,在linux上需要两件事:修改argv[0]from C(用于ps auxf和朋友)和使用PR_SET_NAME标志调用prctl。
argv[0]
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”:(。但是top和ps -A将显示新的“testing yeah”进程名:)。而且killall和pkill将使用新名称。
top
ps -A
killall
pkill
顺便说一下,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上不起作用。
实际上,在linux上需要两件事:修改
argv[0]
fromC
(用于ps auxf
和朋友)和使用PR_SET_NAME
标志调用prctl
。完全没有办法从python本身开始。不过,您可以通过调用prctl来更改进程名。
ps auxf
之后将只显示“python”:(。但是top
和ps -A
将显示新的“testing yeah”进程名:)。而且killall
和pkill
将使用新名称。顺便说一下,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上不起作用。
相关问题 更多 >
编程相关推荐