Аргумент командной строки Python для существующего процесса - PullRequest
3 голосов
/ 05 августа 2011

Я пытаюсь написать сценарий для управления использованием ЦП виртуальной машины KVM с помощью cpulimit. С помощью cpulimit я могу ограничить использование процессором виртуальной машины с pid скажем 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

чтобы перезаписать существующий лимит. Я хочу написать это поведение. Было бы здорово, если бы вы могли предоставить указатель или идею о том, как написать этот скрипт. Большое спасибо

  • Сетху

Ответы [ 2 ]

1 голос
/ 05 августа 2011

Редактировать: Если вам нужно поговорить с существующим cpulimit, вы должны посмотреть на принятый ответ на Как записать данные в STDIN существующего процесса из внешнего процесса?

В основном, сделать

(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')
0 голосов
/ 05 августа 2011

Откройте подпроцесс, такой как 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...