有没有办法改变Python中的有效进程名称?
题
我可以更改Python脚本的有效进程名称吗?当我获取系统进程列表时,我想显示不同的名称而不是进程的真实名称。在C中我可以设置
strcpy(argv[0],"othername");
但在Python中
argv[0] = "othername"
似乎不起作用。当我得到进程列表时( ps ax
在我的linux机器中)真实姓名不会改变。我更喜欢便携式解决方案(或者一种针对 posix 的解决方案,另一种针对 Windows 环境的解决方案)(如果存在)。
提前致谢
解决方案
简单地说,有没有可移植的方法。你必须以测试系统,并使用优选的方法该系统。
此外,我很困惑你在Windows的意思进程名称是什么。
你的意思是一个服务名称?我相信这样的,因为没有别的真正使任何意义(至少我的非Windows使用大脑)。
如果是这样,你需要使用添金的WMI接口和调用.Change方法服务......至少根据他教程。
有关的Linux都不除了此包装很差模块我发现工作的方法的该套的argv [0]为您服务。
我甚至不知道这是否会在BSD变体的工作(这确实有一个使用setproctitle系统调用)。我敢肯定的argv [0]将不会在Solaris上运行。
其他提示
我最近写的一个Python模块更改流程标题在便携方式:检查 HTTPS:/ /github.com/dvarrazzo/py-setproctitle
有周围使用的PostgreSQL执行标题变化的代码的包装。它目前正在测试针对Linux和Mac OS X:视窗(具有有限的功能)和BSD portings在途中
编辑: 2010年7月,该模块与BSD及Windows功能有限,并且已经被移植到Python 3.x的
。实际上你在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()
ps auxf
之后将仅显示“python”:(。但 top
和 ps -A
将显示新的“testing yes”进程名称:)。还 killall
和 pkill
将使用新名称。
顺便说一句,来自 googlecode 的 procname 也发生了变化 argv[0]
, ,因此,甚至改变 ps auxf
输出。
更新:这个答案中发布的解决方案有时在 FreeBSD 上效果不佳。我现在正在使用 py-setproctitle 指出 在这个答案中 在各种 linux 和 freebsd 机器上花了一年左右的时间。目前还没有失败!大家也应该如此!:)。它使用几乎相同的代码 PostgreSQL 用途 在其主数据库和子进程中。
对使用setproctitle 封装的外观
这是一个相当便携版本,适用于多种平台。
首先,我不知道,仅仅设置argv[0]
在C程序可移植性改变ps
显示的名称。也许它在一些unixen,但我的理解是,它没有预料到了。
其次,由于视窗具体非POSIX兼容,只有几件事情是POSIX和非POSIX之间“便携式”。既然你说具体“PS”,我假设POSIX是你的优先和Windows可能无法正常工作。
更重要的是,我的改变argv[0]
的理解是,它需要一个电话exec
进行这些改变。具体而言,exec
呼叫既具有到可执行的路径和一个单独的argv
列表。制作自己的呼叫,可以打破把可执行文件名中argv[0]
的外壳约定。
您有 OS库流程管理,让你直接访问在OS库这样做。你应该考虑将你的脚本分为两个部分 - 起动器和“真正的工作”。起动建立运行时环境和exec与所需参数的实际工作。
在C,你与另一个替换自己的过程。在Python中,你有一个新的,具有不同的argv [0]替换旧的Python解释器。但愿它不会在这个在所不惜。有些程序检查的argv [0]来决定他们在做什么。
您还可以 subprocess.popen ,你可以用它来设置所需的指定参数和可执行文件。在这种情况下,然而,父进程应该不散各地收集孩子当孩子完成。母体也可以不执行任何操作多于一个Popen.wait
我要回答的标记为重复<类似的问题/一个>:
有是simplier(你不需要输入任何库),但也许不那么优雅的方式。你要不要使用“ENV”的家当线内。
在换句话说,这将被命名为“蟒”在进程列表:
#!/usr/bin/env python
但是,这将与您的脚本名称被命名为:
#!/usr/bin/python
所以,你就可以用类似pidof -x scriptname
或ps -C scriptname
找到它
我已经发现蟒-使用prctl 以很好地工作在Linux下。你必须找到为Windows别的东西。
In [1]: import sys
In [2]: print sys.argv[0]
C:\Python25\scripts\ipython.py
In [3]: sys.argv[0] = 'foo'
In [4]: print sys.argv[0]
foo
请注意单个 '=' 符号