从 python 框架向 sudoed C 子进程发送 Ctrl+C SIGINT
Sending a Ctrl+C SIGINT to sudoed C subprocess from python framework
我是 运行 一个 python 子进程,使用
p = Popen(["sudo", "./a.out"])
其中 a.out
是一个 C 可执行文件,它会连续运行,直到向其发送 SIGINT 或 Ctrl+C 信号。我在使用 subprocess.Popen
对象函数(例如 send_signal()
时遇到了麻烦,因为 Operation not permitted
错误是由于可执行文件的 sudo
性质引起的。在此之后,我尝试通过以下方式向子进程发送 SIGINT:
os.system(f"sudo kill -2 {p.pid}")
但这似乎没有正确定位流程。 运行 快速 sudo netstat -lpnt
检查显示 a.out
进程仍在 运行 上的 pid 与 p.pid
返回的不同(通常是几个整数,即 p.pid
returns 3031 但 a.out
是 3035)。我有什么误解吗?
您实际上正在获取 pid 并终止 sudo 进程(它分叉了您的应用程序进程)。相反,您应该使用以下命令终止整个进程组:
import subprocess, os
p = Popen(["sudo", "./a.out"])
pgid = os.getpgid(p.pid)
subprocess.check_output("sudo kill {}".format(pgid))
或借助 pkill:
import subprocess
p = Popen(["sudo", "./a.out"])
subprocess.call(f"sudo pkill -2 -P {p.pid})
我是 运行 一个 python 子进程,使用
p = Popen(["sudo", "./a.out"])
其中 a.out
是一个 C 可执行文件,它会连续运行,直到向其发送 SIGINT 或 Ctrl+C 信号。我在使用 subprocess.Popen
对象函数(例如 send_signal()
时遇到了麻烦,因为 Operation not permitted
错误是由于可执行文件的 sudo
性质引起的。在此之后,我尝试通过以下方式向子进程发送 SIGINT:
os.system(f"sudo kill -2 {p.pid}")
但这似乎没有正确定位流程。 运行 快速 sudo netstat -lpnt
检查显示 a.out
进程仍在 运行 上的 pid 与 p.pid
返回的不同(通常是几个整数,即 p.pid
returns 3031 但 a.out
是 3035)。我有什么误解吗?
您实际上正在获取 pid 并终止 sudo 进程(它分叉了您的应用程序进程)。相反,您应该使用以下命令终止整个进程组:
import subprocess, os
p = Popen(["sudo", "./a.out"])
pgid = os.getpgid(p.pid)
subprocess.check_output("sudo kill {}".format(pgid))
或借助 pkill:
import subprocess
p = Popen(["sudo", "./a.out"])
subprocess.call(f"sudo pkill -2 -P {p.pid})