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

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和朋友),并调用prctlPR_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将显示:(.但经过只是"蟒蛇" topps -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.


val*_*gog 9

看看setproctitle

这是一个非常便携的版本,适用于许多平台.

  • 在 Linux 上完美运行。并不真正在 Windows 上工作,并由“setproctitle”文档承认。真正的 Windows 解决方案很可能很困难。 (2认同)

Sas*_* Ru 6

我对标记为重复的类似问题的回答:

有更简单的方法(您不需要导入任何库),但可能不是那么优雅的方法。您必须不要在 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