C’è un modo per modificare efficace nome del processo in Python?

Posso modificare efficace processo nome di uno script Python? Voglio mostrare un altro nome al posto del vero nome del processo, quando ricevo il processo di sistema, lista. In C posso impostare

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

Ma in Python

argv[0] = "othername"

non sembra funzionare. Quando ho l’elenco di processo (con ps ax nella mia linux box) il vero nome non cambia. Io preferisco una soluzione portatile (o altrimenti una soluzione per posix e un altro per gli ambienti windows), se esiste.

Grazie in anticipo

InformationsquelleAutor Emilio | 2009-02-19

 

8 Replies
  1. 13

    Semplicemente, non c’è portabile. Dovrete test per il sistema e utilizzare il metodo preferito per il sistema.

    Inoltre, sono confuso su cosa si intende per processo di nomi su Windows.

    Vuoi dire il nome di un servizio? Presumo quindi, perché niente altro fa davvero alcun senso (almeno per il mio non-Windows usando il cervello).

    Se è così, è necessario utilizzare Tim Golden interfaccia WMI e chiamare il .Metodo di cambiamento sul servizio… almeno secondo il suo tutorial.

    Per Linux nessuno dei metodi che ho trovato ha funzionato tranne che per questo mal confezionati modulo che imposta argv[0] per voi.

    Non so nemmeno se questo funziona su varianti di BSD (che non hanno un setproctitle chiamata di sistema). Sono abbastanza sicuro che, argv[0] non funziona su Solaris.

    • So che è tardi, ma per i nuovi lettori, in considerazione anche @MattWritesCode risposta, veloce e semplice per Disponibile su Linux.
  2. 81

    Recentemente ho scritto un modulo Python per modificare il processo di titolo in un portatile: il check https://github.com/dvarrazzo/py-setproctitle

    È un wrapper per il codice utilizzato da PostgreSQL per eseguire il cambio di titolo. È attualmente testato contro Linux e Mac OS X: Windows (con funzionalità limitate) e BSD portings sono sulla strada.

    Edit: a partire da luglio 2010, il modulo funziona con BSD e con funzionalità limitate su Windows, ed è stato fatto il porting di Python 3.x.

    • Non è possibile installare su windows.
    • non importa: non è molto utile su Windows, ma non c’è molto da fare.
    • C’è un modo per modificare gli argomenti visualizzati da ps -f? Non mi interessa circa il nome del programma (sempre python), ma voglio cambiare visualizzato argomenti.
    • vuoi dire che si desidera che l’uscita di “ps -f”, diverso da quello di “ps”? Che non si può avere, per quanto ne so.
    • Che non è un modulo Python. Si tratta di un C modulo.
    • Su Mac OSX funziona per ps, ma non per il top o il Monitor Attività.

  3. 51

    in realtà avete bisogno di 2 cose su linux: modificare argv[0] da C (per ps auxf e amici) e chiamare prctl con PR_SET_NAME bandiera.

    Non c’è assolutamente alcun modo per fare il primo pezzo da python stesso. Anche se, si può solo cambiare il nome del processo chiamando 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 mostra ‘python’ dopo che :(. Ma top e ps -A mostrerà nuovi test yeah’ nome del processo :). Anche killall e pkill funzionerà con il nuovo nome.

    btw, procname da googlecode cambia anche argv[0], così, anche, cambiamenti ps auxf uscita.

    AGGIORNAMENTO: La soluzione postato in questa risposta, non è bello giocare a volte su FreeBSD. Ora sto utilizzando py-setproctitle dichiarato in questa risposta per un anno o così su vari linux e freebsd scatole. Non riesce finora! Tutti dovrebbero troppo! :). Utilizza quasi lo stesso codice come PostgreSQL utilizza nel suo database e processi figli.

    • procname non funziona su di PyPy (solo in CPython) è necessario utilizzare setproctitle.
  4. 4

    Primo, io non sono sicuro che semplicemente le impostazioni argv[0] in un programma C portabile cambia il nome che appare in ps. Forse c’è, in alcuni unixen, ma la mia comprensione è che non è previsto.

    Secondo, dato che Windows è in particolare non conforme a POSIX, solo un paio di cose sono “portatili” tra POSIX e non POSIX. Dal momento che è specificamente dire ‘ps’, darò per scontato che POSIX è la vostra priorità e Windows potrebbe non funzionare.

    Più importante, la mia comprensione di cambiare argv[0] è che richiede una chiamata al exec per apportare queste modifiche. In particolare, il exec chiamata sia un percorso di un file eseguibile e un separato argv elenco. Rendere il proprio call permette di rompere il guscio convenzione di mettere il nome del file eseguibile in argv[0].

    Hai OS biblioteca del processo di gestione che dà accesso diretto al sistema operativo in biblioteca per fare questo. Si consiglia di suddividere il tuo script in due parti: un antipasto e un “vero lavoro”. Il motorino di avviamento stabilisce l’ambiente di run-time e exec il lavoro vero e proprio con i parametri desiderati.

    In C, si sta sostituendo il proprio processo con un altro. In Python, si sta sostituendo il vecchio interprete Python con uno nuovo che ha un diverso argv[0]. Speriamo che non si fermava a questo. Alcuni programmi di controllo argv[0] per decidere cosa stanno facendo.

    Hai anche sottoprocesso.popen che è possibile utilizzare per impostare il desiderato args e l’eseguibile. In questo caso, tuttavia, il processo padre deve aleggia intorno a raccogliere il bambino quando il bambino finiture. Il genitore non può fare niente di più di un Popen.wait

    • No, la modifica argv in Linux (e probabilmente altri Unix, ma non tutti) fa cambiare immediatamente visibile nome del processo, che è ampiamente utilizzato da molti programmi utilizzati per dare nomi descrittivi per i loro processi: sia ssh e postgres fare questo, e alcune attivamente cambiare il loro nome al volo per indicare il loro stato attuale. Un modulo Python potrebbe essere scritto per fare questo, utilizzando il Py_GetArgcArgv chiamata API.
  5. 4

    La mia risposta alla domanda simile contrassegnati come duplicato:

    C’è di più semplice (non c’è bisogno di importare librerie), ma forse non così in modo elegante. È necessario non utilizzare “env” all’interno del shebang linea.

    In altre parole, questo verrà denominato come “python” nel processo di lista:

    #!/usr/bin/env python

    Ma questo sarà il nome con il tuo scriptname:

    #!/usr/bin/python

    Così sarete in grado di trovare qualcosa come pidof -x scriptname o ps -C scriptname

  6. -15
    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

    Nota il singolo ‘=’ segno

    • Ma se ho eseguito ps (elenco dei processi in linux box) il nome del processo rimangono esattamente gli stessi. Provare
    • Questo non cambia il nome del processo a tutti. Si cambia solo Python copia di argv. Vorrei raccomandare l’eliminazione di questo, ovviamente, la risposta è sbagliata.

Lascia un commento