【问题标题】:Python command line argument for an existing process现有进程的 Python 命令行参数
【发布时间】:2011-08-04 23:50:39
【问题描述】:

我正在尝试编写一个脚本来控制使用 cpulimit 的 VM n KVM 的 cpu 使用情况。使用 cpulimit 我可以通过以下方式限制 pid 为 2112 的 VM 的 cpu 使用率:

./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

覆盖现有限制。我想编写此行为的脚本。如果您能提供有关如何编写此脚本的指针或想法,那就太好了。非常感谢

  • 塞图

【问题讨论】:

    标签: python linux process arguments


    【解决方案1】:

    编辑:如果您需要与现有的cpulimit 交谈,您应该查看How to write data to existing process's STDIN from external process? 接受的答案

    基本上,做

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

    当你启动cpulimit 时,因为它的输入需要是一个管道。

    然后,从 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')
    

    【讨论】:

    • +1 表示 Popen,但 communicate 不好 - 它关闭标准输入并等待进程终止。您应该改为写入 process.stdin。
    • @orip 我读过直接与 stdin/stdout 交互很容易出现竞争条件。这不是真的吗?
    • @brandizzi 也许你的意思是这个只与多线程代码相关的问题:bugs.python.org/issue2320,他们的最终分析表明即使没有 stdin=PIPE 也会发生并发错误。很有趣。
    • 我已经编辑了我的答案;如果您以管道开头 cpulimitstdin,我发布的内容应该可以工作。
    • 我只有一个疑问?我们为什么要写信给 2112 ?那将是VM对吗?如果一定要写,应该是cpulimit进程的终端吧?
    【解决方案2】:

    打开一个像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()
    

    【讨论】:

    • 感谢您的回复。这是第一次它会起作用。但请考虑脚本在生成进程并设置初始限制后终止。一秒钟后,如果调用了该 api。我将无法继续编写 p.stdin.write("40\n")。这就是我担心的情况。是否可以从进程 ID 生成?我将能够检索正在运行的 cpulimit 实例的进程 ID。
    • 子进程为什么会终止?如果 climit 等待标准输入关闭,它应该保持活动状态。
    • 他的意思是 Python 脚本没有产生进程;他需要对现有的cpulimit 执行此操作。
    • @agf 是的,我想对现有进程执行此操作。
    • 看看我编辑过的答案,我会告诉你怎么做,并链接到一个包含更多细节的帖子。
    猜你喜欢
    • 2012-10-31
    • 2010-12-12
    • 1970-01-01
    • 2018-12-17
    • 2012-02-20
    • 1970-01-01
    • 2018-12-15
    • 2019-08-05
    • 2015-08-09
    相关资源
    最近更新 更多