Python命令行参数用于现有进程

3 投票
2 回答
754 浏览
提问于 2025-04-16 22:56

我正在尝试写一个脚本,用来控制KVM虚拟机的CPU使用率,使用的工具是cpulimit。通过cpulimit,我可以限制一个虚拟机的CPU使用率,比如说它的进程ID是2112,我可以这样做:

./cpulimit -p 2112 -l 50

我想写一个脚本,能够打开一个接口:

setcpu (vm_pid, limit)

这个接口可以被调用多次,并且我希望能够覆盖之前设置的限制。我可以通过在运行的cpulimit进程中添加限制值作为运行时参数来覆盖现有限制。就像使用subprocess.Popen(..., stdin=subprocess.PIPE)那样。我有点困惑,不知道怎么抓取正在运行的进程并提供运行时参数。例如(不使用脚本):

# ./cpulimit -p 2112 -l 50

 Process 2112 detected 

这时会对这个进程设置一个上限。现在我可以简单地输入:

40

80

来覆盖之前的限制。我想把这个行为写成脚本。如果你能给我一些建议或者思路,告诉我怎么写这个脚本,那就太好了。非常感谢!

  • Sethu

2 个回答

0

像agf展示的那样打开一个子进程时,别忘了要指定stdin是通过管道连接的:

import subprocess
p = subprocess.Popen("./cpulimit -p 2112 -l 50", stdin=subprocess.PIPE)

然后可以写入p.stdin

p.stdin.write("40\n")
p.stdin.flush()
1

补充说明:如果你需要和一个已经存在的 cpulimit 进行交流,你可以看看这个问题的被接受答案:如何从外部进程向现有进程的标准输入写数据?

基本上,你需要在启动 cpulimit 时执行

(while [ 1 ]; do sleep 1; done) | ./cpulimit -p 2112 -l 50.

因为它的输入需要是一个管道。

然后,从 Python 中写入 /proc/{pid_of_cpulimit}/fd/0


如果你已经启动了一个进程,使用

process = subprocess.Popen(['./cpulimit', '-p', '2112', '-l', '50'], stdin=subprocess.PIPE)

那么只需执行

process.communicate(input='40')
process.communicate(input='80')

撰写回答