Emi*_*lio 74 python arguments process ps hide
我可以更改Python脚本的有效进程名称吗?当我获得系统进程列表时,我想显示一个不同的名称而不是进程的真实名称.在CI中可以设置
strcpy(argv[0],"othername");
Run Code Online (Sandbox Code Playgroud)
但在Python中
argv[0] = "othername"
Run Code Online (Sandbox Code Playgroud)
似乎不起作用.当我获得进程列表(ps ax
在我的linux框中)时,真实姓名不会改变.如果存在,我更喜欢便携式解决方案(或者一个用于posix的解决方案和另一个用于Windows环境的解决方案).
提前致谢
pir*_*iro 83
我最近编写了一个Python模块,以便携式方式更改流程标题:检查https://github.com/dvarrazzo/py-setproctitle
它是PostgreSQL用于执行标题更改的代码的包装器.它目前针对Linux和Mac OS X进行了测试:Windows(功能有限)和BSD移植正在进行中.
编辑:截至2010年7月,该模块使用BSD并在Windows上具有有限的功能,并已移植到Python 3.x.
Vad*_*int 51
其实你需要在Linux上两件事情:修改argv[0]
从C
(用于ps auxf
和朋友),并调用prctl
与PR_SET_NAME
标志.
绝对没有办法从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()
Run Code Online (Sandbox Code Playgroud)
ps auxf
将显示:(.但经过只是"蟒蛇" top
和ps -A
将显示新的"测试啊"进程名:).此外killall
,pkill
将使用新名称.
顺便说一句,来自googlecode的procname也会改变argv[0]
,因此,甚至会改变ps auxf
输出.
更新:在这个答案中发布的解决方案有时在FreeBSD上不会很好.我现在使用py-setproctitle 在这个答案中陈述了一年左右的各种linux和freebsd盒子.到目前为止没有失败!每个人都应该!:).它使用与PostgreSQL 在其主数据库和子进程中使用的代码几乎相同的代码.
Van*_*ale 13
简而言之,没有便携的方式.您必须测试系统并使用该系统的首选方法.
此外,我对Windows上的进程名称的含义感到困惑.
你的意思是服务名称?我认为是这样,因为没有其他任何事情真正有意义(至少我的非Windows使用大脑).
如果是这样,你需要使用Tim Golden的WMI接口并在服务上调用.Change方法......至少根据他的教程.
对于Linux,除了这个为你设置argv [0]的包装不好的模块之外,我找不到任何方法.
我甚至不知道这是否适用于BSD变体(它有一个setproctitle系统调用).我很确定argv [0]不适用于Solaris.
看看setproctitle包
这是一个非常便携的版本,适用于许多平台.
我对标记为重复的类似问题的回答:
有更简单的方法(您不需要导入任何库),但可能不是那么优雅的方法。您必须不要在 shebang 行中使用“env”。
换句话说,这将在进程列表中被命名为“python”:
#!/usr/bin/env python
Run Code Online (Sandbox Code Playgroud)
但这将以您的脚本名称命名:
#!/usr/bin/python
Run Code Online (Sandbox Code Playgroud)
所以你可以用类似pidof -x scriptname
或的东西找到它ps -C scriptname
归档时间: |
|
查看次数: |
50690 次 |
最近记录: |