有没有办法在Python中更改有效的进程名称?
我可以更改Python脚本的有效进程名称吗? 当我得到系统进程列表时,我想显示一个不同的名称而不是进程的真实名称。 在CI中可以设置
strcpy(argv[0],"othername");
但在Python中
argv[0] = "othername"
似乎没有工作。 当我得到进程列表(在我的linux系统中使用ps ax
)时,真实姓名不会改变。 如果存在的话,我更喜欢便携式解决方案(或者其他解决方案用于posix,另一种解决方案适用于Windows环境)。
提前致谢
简而言之,没有便携的方式。 您必须测试系统并使用该系统的首选方法。
此外,我对Windows中进程名称的含义感到困惑。
你的意思是服务名称? 我认为是这样,因为没有其他东西真的有意义(至少对我的非Windows使用大脑)。
如果是这样,您需要使用Tim Golden的WMI界面,并在服务上调用.Change方法...至少根据他的教程。
对于Linux,除了为您设置argv [0]的这个打包不足的模块外,没有任何方法可以工作。
我甚至不知道这是否适用于BSD变体(它确实具有setproctitle系统调用)。 我非常确定argv [0]在Solaris上不起作用。
我最近编写了一个Python模块以便携方式更改进程标题:请查看https://github.com/dvarrazzo/py-setproctitle
它是PostgreSQL用于执行标题更改的代码的一个包装。 目前它针对Linux和Mac OS X进行了测试:Windows(功能有限)和BSD移植正在进行中。
编辑:截至2010年7月,该模块与BSD一起工作,并且在Windows上的功能有限,并已移植到Python 3.x.
实际上你需要在Linux上做两件事:从C
(对于ps auxf
和朋友)修改argv[0]
,并用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
也将使用新名称。
顺便说一句,来自googlecode的procname也改变了argv[0]
,因此,甚至改变了ps auxf
输出。
更新 :在这个答案中发布的解决方案有时在FreeBSD上播放不好。 我现在使用py-setproctitle在这个答案中陈述了一年左右的各种linux和freebsd框。 目前为止没有失败! 大家也应该! :)。 它使用与PostgreSQL在其主数据库和子进程中使用的几乎相同的代码。
链接地址: http://www.djcxy.com/p/46401.html上一篇: Is there a way to change effective process name in Python?
下一篇: Why is '#!/usr/bin/env python' supposedly more correct than just '#!/usr/bin/python'?