如何在 Python 中获取进程的 pid

如何在 Python 中获取进程的 pid

我编写了这个脚本来停止进程:

parser = argparse.ArgumentParser(description='this script allows you to   connect a device in your network')
parser.add_argument('-m', '--mac', dest='mac', type=str, required=True, help='put mac of victim')
args = parser.parse_args()
mac_host =str(args.mac)
print "mac_host %s"%mac_host
p = subprocess.Popen("sudo kill -9 $(sudo ps aux|grep '(" + mac_host + ")'|grep -v grep|awk '{print $2}')", shell=True, stdout=subprocess.PIPE)
output = p.communicate()[0].rstrip()

但是我有一个问题:pid 始终是空的。

mac_host 14:KL:73:GH:45:7f

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.

我该如何解决这个问题?谢谢。

答案1

我猜这应该是一个正则表达式?

grep '(" + mac_host + ")'

尝试使用egrepgrep -e

看起来您想使用正则表达式,但正在寻找上面输入的确切术语。或者,如果它一直被称为 mac_host,那么删除其他所有内容

grep "mac_host"

还放了一个

set +x

在您的脚本中调试您的脚本。

干杯,s1mmel

答案2

Bleh 还不能发表评论,

以上是正确的,但是如果您使用 pgrep,则需要清理的内容会更少。它仅返回 pid(而不是 ps 的整行)。

p = subprocess.Popen("sudo kill -9 $(sudo ps aux| pgrep '(" + mac_host + ")')", shell=True, stdout=subprocess.PIPE)

编辑:

如果您想尝试不使用子进程/shell 命令,您可以尝试这样的操作,

import os
from signal import SIGKILL


pids = [pid for pid in os.listdir('/proc') if pid.isdigit()]
for pid in pids:
    if mac_host in open(os.path.join('/proc', pid, 'cmdline'), 'rb').read():
        os.kill(int(pid), SIGKILL)

如果“if mac_host in”不能完成其工作,则可能需要正则表达式。

使用来源:

如何使用 pid 从 python 终止进程

通过 python 在 Linux 上列出进程

相关内容