有没有办法在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':(但是topps -A会显示新的'testing yeah'进程名:)。 killallpkill也将使用新名称。

顺便说一句,来自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'?