我可以更改Python脚本的有效进程名称吗?当我获得系统进程列表时,我想显示一个不同的名称而不是进程的真实名称。在CI中可以设置
strcpy(argv[0],"othername");
但是在Python中
argv[0] = "othername"
似乎不起作用。当我获得进程列表(ps ax
在Linux框中带有)时,真实姓名不变。如果存在的话,我更喜欢一种便携式解决方案(或者针对posix的一种解决方案,以及针对Windows环境的另一种解决方案)。
提前致谢
我可以更改Python脚本的有效进程名称吗?当我获得系统进程列表时,我想显示一个不同的名称而不是进程的真实名称。在CI中可以设置
strcpy(argv[0],"othername");
但是在Python中
argv[0] = "othername"
似乎不起作用。当我获得进程列表(ps ax
在Linux框中带有)时,真实姓名不变。如果存在的话,我更喜欢一种便携式解决方案(或者针对posix的一种解决方案,以及针对Windows环境的另一种解决方案)。
提前致谢
Answers:
简而言之,没有可移植的方法。您必须测试系统,并使用该系统的首选方法。
此外,我对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上具有有限的功能,并且已移植到Python3.x。
实际上,在Linux上,您需要做两件事:argv[0]
从C
(对于ps auxf
和朋友)进行修改,并prctl
用PR_SET_NAME
flag调用。
绝对没有办法从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
将显示只是:(后“蟒蛇”,但top
和ps -A
将显示新的“测试啊”进程名:)。还killall
和pkill
将与新名称的工作。
顺便说一句,googlecode的procname也会更改argv[0]
,因此,甚至会更改ps auxf
输出。
更新:此答案中发布的解决方案有时在FreeBSD上效果不佳。我现在正在使用PY-使用setproctitle说在这个答案了一年左右的各种Linux和FreeBSD盒。到目前为止没有失败!每个人也应该!:)。它使用几乎相同的代码PostgreSQL的 使用在其主数据库和子进程。
看看setproctitle包
这是一个可移植的版本,可以在许多平台上使用。
pip install setproctitle
import setproctitle
setproctitle.setproctitle('new proc title as seen in top')
首先,我不确定argv[0]
C程序中的简单设置是否可以移植地更改所示的名称ps
。也许它在某些unixen中可以,但是我的理解是它并不期望如此。
其次,由于Windows特别不兼容POSIX,因此在POSIX和非POSIX之间只有几件事是“可移植的”。由于您专门说“ ps”,因此我假定POSIX是您的优先事项,并且Windows可能无法正常工作。
更重要的是,我对变更的理解argv[0]
是它需要exec
进行更改。具体来说,该exec
调用既有指向可执行文件的路径,又有单独的argv
列表。进行自己的调用可让您打破将可执行文件名称放入中的shell约定argv[0]
。
您具有OS库进程管理,可以直接访问OS库来执行此操作。您应该考虑将脚本分为两部分-入门和“实际工作”。启动程序将建立运行时环境,并使用所需的参数执行实际工作。
在C语言中,您将自己的过程替换为另一个过程。在Python中,您要用具有不同argv [0]的新Python解释器替换旧的Python解释器。希望它不会对此感到沮丧。一些程序检查argv [0]来确定它们在做什么。
您还具有subprocess.popen,可用于设置所需的args和可执行文件。但是,在这种情况下,当孩子完成工作时,父进程应该徘徊以收集孩子。父母可能只做一件事Popen.wait
我发现python-prctl在Linux下可以很好地工作。您将不得不为Windows找到其他东西。