0

我正在使用 pkill 通过 python 子进程向 suricata 发送 USR2 信号,如下所示:

#!/usr/bin/python3

script_command='pkill -SIGUSR2 -f /usr/bin/suricata'
exit_status = subprocess.call(script_command, env=self.config_environment, shell=True)

结果是:exit_status = -12

当我在终端上执行时:

pkill -SIGUSR2 -f /usr/bin/suricata
echo $?

结果是:0

据我了解文档在https://docs.python.org/3/library/subprocess.html#subprocess.CompletedProcess.returncode

Python是否检测到pkill进程或suricata进程的返回码是12?

当成功将 USR2 发送到 suricata 并且与进程的反馈相对应的负退出代码时,如何绕过此机制并强制subprocess.call返回 0 ?pkillpkill

4

1 回答 1

2

您链接的文档说

负值-N表示子进程被信号终止N(仅限 POSIX)。

这意味着运行的进程subprocess.call()被 SIGUSR2 杀死(因为SIGUSR2是 12)。

由于您使用的是shell=True,因此将有一个带有命令行的进程sh -c '... suricata',它将被匹配pkill -f(因为-f意味着该模式通常只与进程名称匹配。设置 -f 时,将使用完整的命令行。)。

你可能想做

ret = subprocess.call([
  shutil.which("pkill"),
  "-SIGUSR2",
  "-f",
  "/usr/bin/suricata",
])

避免额外的shell进程。

更好的是,您可以使用 egpsutil找到 Suricata 进程并将其杀死。

编辑

从评论:

不过pkill -SIGUSR2 -F /var/run/suricata.pid也够了

如果你手头有一个 pidfile,你不需要pkill任何东西......

import os
import signal

with open("/var/run/suricata.pid", "r") as pidfile:
  pid = int(pidfile.read().strip())
  os.kill(pid, signal.SIGUSR2)
于 2022-01-17T15:59:43.927 回答