Python命令行参数用于现有进程
我正在尝试写一个脚本,用来控制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')