Pergunta

Posso alterar o nome do processo eficaz de um script Python? Eu quero mostrar um nome diferente em vez do nome real do processo, quando eu chegar a lista de processos do sistema. Em C eu posso definir

strcpy(argv[0],"othername");

Mas em Python

argv[0] = "othername"

não parece trabalho. Quando eu chegar lista de processos (com ps ax na minha caixa de linux) o nome verdadeiro não muda. Eu prefiro uma solução portátil (ou solução mais ninguém para posix e outro para ambientes Windows), se ele existir.

Agradecemos antecipadamente

Foi útil?

Solução

Simplesmente, não há nenhuma maneira portátil. Você vai ter que teste para o sistema e usar o método preferido para esse sistema.

Além disso, eu estou confuso sobre o que você quer dizer com nomes de processo no Windows.

Você quer dizer um nome de serviço? Presumo que sim, porque nada mais realmente faz algum sentido (pelo menos para o meu não-Windows usando cérebro).

Se assim for, você precisa usar Tim Golden WMI interface de e chamar o método .Alterar em o serviço ... pelo menos de acordo com sua tutorial .

Para Linux nenhum dos métodos que eu encontrei trabalharam exceto para este módulo mal embalados que os conjuntos argv [0] para você.

Eu não sei mesmo se este trabalho em BSD variantes (que tem uma chamada de sistema setproctitle). Tenho certeza que argv [0] não funciona no Solaris.

Outras dicas

Eu escrevi recentemente um módulo Python para alterar o título processo de uma maneira portátil: verificação https: / /github.com/dvarrazzo/py-setproctitle

É um invólucro em torno do código usado pelo PostgreSQL para executar a mudança de título. Actualmente é testado contra o Linux e Mac OS X:. Do Windows (com funcionalidade limitada) e portings BSD estão a caminho

Editar:. a partir de julho de 2010, as obras do módulo com BSD e com funcionalidade limitada no Windows, e foi portado para Python 3.x

Na verdade, você precisa de 2 coisas no Linux: argv[0] Modificar C (para ps auxf e amigos) e prctl chamada com bandeira PR_SET_NAME

.

Não há absolutamente nenhuma maneira de fazer primeiro pedaço da própria python. Embora, você pode simplesmente mudar o nome processo, chamando 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 irá mostrar apenas 'python' depois que :(. Mas top e ps -A vai mostrar novo 'testando sim' nome do processo :). Também killall e pkill irá trabalhar com novo nome.

btw, procname de GoogleCode também muda argv[0], assim, mesmo, muda de saída ps auxf.

Atualizar : A solução postou esta resposta não jogar bonito, às vezes no FreeBSD. Agora estou usando py-setproctitle declarou in esta resposta por um ano ou assim por diante vários linux e caixas de FreeBSD. Sem falhar até agora! Todo mundo deve também! :). Ele usa quase o mesmo código como PostgreSQL usos em seus principais processos de banco de dados e criança

Tenha um olhar em setproctitle pacote

Esta é uma versão bastante portátil e funciona em muitas plataformas.

Em primeiro lugar, eu não tenho certeza que simplesmente configurações argv[0] em um programa C portably muda o nome mostrado na ps. Talvez ele faz em alguns unixen, mas o meu entendimento é que não é esperado para.

Em segundo lugar, uma vez que o Windows é compatível especificamente não POSIX, apenas algumas coisas são "portáteis" entre POSIX e não-POSIX. Desde que você especificamente dizer 'ps', eu vou assumir que POSIX é a sua prioridade e Windows pode não funcionar.

Mais importante, a minha compreensão da mudança argv[0] é que ele requer uma chamada para exec para fazer essas mudanças. Especificamente, a chamada exec tem tanto um caminho para um executável e uma lista argv separado. Efectuar a sua própria chamada permite que você quebre a convenção shell de colocar o nome do executável em argv[0].

Você OS processo de biblioteca de gerenciamento que lhe dá acesso directo para a biblioteca oS para fazer isso. Você deve considerar quebrar o seu script em duas partes - uma entrada e o "trabalho real". O motor de arranque estabelece o ambiente de tempo de execução e exec é o verdadeiro trabalho com os parâmetros desejados.

Em C, você está substituindo seu próprio processo com o outro. Em Python, você está substituindo o interpretador Python velho por um novo que tem uma argv diferente [0]. Esperamos que ele não vai se recusam a isso. Alguns programas verificar argv [0] para decidir o que eles estão fazendo.

Você também tem subprocess.popen que você pode usar para definir os seus argumentos e executável desejados. Neste caso, no entanto, o processo pai deve permanece em torno de recolher a criança quando a criança acabamentos. O pai pode não estar fazendo nada mais do que um Popen.wait

A minha resposta à pergunta semelhante identificado como duplicado :

Há simplier (você não precisa importar qualquer libs), mas talvez não forma tão elegante. Você tem que não use "env" dentro da linha shebang.

Em outras palavras, este será nomeado como "python" na lista de processos:

#!/usr/bin/env python

Mas este será nomeado com o seu scriptname:

#!/usr/bin/python

Então você vai ser capaz de encontrá-lo com algo como pidof -x scriptname ou ps -C scriptname

Eu encontrei python-prctl funcionar muito bem no Linux. Você terá que encontrar outra coisa para 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

Observe o sinal single '='

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top