通过Python查杀进程树时出现语法错误

时间:2016-11-16 08:33:37

标签: python ubuntu subprocess

我正在尝试使用此shell命令终止进程树:

kill -TERM -- -3333

所以在python中我使用subprocess

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

该过程按预期终止,但我收到此消息:

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.

为什么我收到此消息以及我做错了什么?

我在Ubuntu 10.04上使用Python 2.6.5。

1 个答案:

答案 0 :(得分:3)

您正在向kill命令传递一个它无法识别的参数。您只需删除--

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

如果不支持--,你可能应该在没有短划线的情况下传入PID,否则也不会产生负值;在这一点上,你只是在发出单一过程的信号。

请注意,您不是通过shell执行此操作,而您的shell 可能具有自己的kill命令实现,Python指示操作系统查找第一个kill <而路径上的em>二进制可执行文件。内置shell可能会接受--,但这不是您在此处执行的命令。

如果您必须使用内置的shell,那么您必须设置shell=True并传入字符串命令行:

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

这使用/bin/sh;您可以使用executable参数设置不同的shell来运行命令:

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

最后但并非最不重要的是,您可能根本不需要kill命令 。 Python可以使用os.kill() function

直接发送信号
import os, signal

os.kill(3333, signal.SIGTERM)

并且os.killpg() function可以向进程组发送信号:

import os, signal

os.killpg(3333, signal.SIGTERM)