2016-11-16 14 views
0

Ich versuche, einen Prozessbaum mit dieser Shell-Befehl zu töten:Syntaxfehler beim Prozessbaum durch Python tötet

kill -TERM -- -3333 

so in Python Ich benutze subprocess:

subprocess.call(['kill', '-TERM', '--', '-3333']) 

der Prozess als beendet wird erwartet, aber ich bekomme diese Nachricht:

ERROR: garbage process ID "--". 
Usage: 
    kill pid ...    Send SIGTERM to every process listed. 
    kill signal pid ...  Send a signal to every process listed. 
    kill -s signal pid ... Send a signal to every process listed. 
    kill -l     List all signal names. 
    kill -L     List all signal names in a nice table. 
    kill -l signal   Convert between signal numbers and names. 

Warum bekomme ich diese Nachricht und was bin ich falsch machen?

Ich benutze Python 2.6.5 auf Ubuntu 10.04.

+0

Es gibt (mindestens) zwei "kills". Es gibt (normalerweise) '/ bin/kill' und die eingebaute Shell. Wenn Sie die eingebaute Shell verwenden möchten, verwenden Sie 'shell = True'. – cdarke

Antwort

3

Sie übergeben den kill Befehl ein Argument, das nicht erkannt wird. Sie könnten einfach fallen die --:

subprocess.call(['kill', '-TERM', '-3333']) 

Sie wahrscheinlich auch werden sollte, ohne einen Bindestrich in der PID vorbei, wenn -- nicht unterstützt wird, wird weder eine negative PID; An diesem Punkt würden Sie nur den einzelnen Prozess signalisieren.

Beachten Sie, dass Sie das nicht durch eine Shell ausführen, während des Shell wahrscheinlich seinen eigenen kill Befehl Implementierung hat, weist Python das O die ersten killausführbare Binärdatei auf dem Weg statt zu finden. Die integrierte Shell akzeptiert möglicherweise --, aber das ist nicht der Befehl, den Sie hier ausführen.

Wenn Sie müssen die Shell verwenden eingebaut, dann werden Sie shell=True gesetzt und in einem String-Befehlszeile übergeben:

subprocess.call('kill -TERM -- -3333', shell=True) 

Dies verwendet /bin/sh; Sie können eine andere Shell setzen den Befehl durch mit dem Argument executable auszuführen:

subprocess.call('kill -TERM -- -3333', shell=True, executable='/bin/bash') 

Last but not least, können Sie den Befehl kill nicht benötigen bei allen. Python können Signale direkt mit dem os.kill() function senden:

import os, signal 

os.kill(3333, signal.SIGTERM) 

und die os.killpg() function kann ein Signal an eine Prozessgruppe senden:

import os, signal 

os.killpg(3333, signal.SIGTERM)