Процесс subprocess.check_output (..), возвращающий тот же результат при запуске в цикле - PullRequest
0 голосов
/ 16 октября 2018

Я новичок в питоне.Поэтому, пожалуйста, потерпите меня :)

Я хочу написать скрипт, который будет проверять загрузку ЦП системы, и в случае, если он пересекает порог, он должен принимать дампы потока вместе с другими деталями.Я написал скрипт на python, как показано ниже, используя команду "vmstat", чтобы увидеть цикл пользователя и системный цикл.Если эти 2 вместе превышают пороговое значение, я возьму дамп потока.

while True:
    output = subprocess.check_output("vmstat|tail -1", shell=True).decode('utf-8');
    m = re.search(r"(\d+)\s+(\d+)\s+(\d+)\s+\d+\s+\d+$", output)
    print('US', int(m.group(1)))
    print('SY', int(m.group(2)))
    # us: Time spent running non-kernel code. (user time, including nice time)
    # sy: Time spent running kernel code. (system time)
    usage=int(m.group(1))+int(m.group(2))
    if usage>CPU:
        ...
    else
        print "cpu usage is below threshold"

Но проблема в том, что я получаю одинаковые значения

US 1
SY 0
cpu usage is below threshold
US 1
SY 0
cpu usage is below threshold
US 1
SY 0
cpu usage is below threshold
US 1
SY 0
cpu usage is below threshold

Одновременно, если я запускаю команду "vmstat"в другой консоли я вижу разные значения параметров 'US' и 'SY' - enter image description here

Я думаю, что subprocess.check_output (..) выполняет команду ""вмстать "процесс только один раз.Можем ли мы как-нибудь включить его запуск каждый раз?

1 Ответ

0 голосов
/ 17 октября 2018

Ваш Python в порядке, за исключением пропущенной точки с запятой после else.

Чтобы увидеть, что идет не так, начните с проверки того, что система будет занята.Запустите команду с интенсивным использованием процессора в каком-либо другом окне терминала, например:

  yes | wc -c

Если у вас нет запасного окна терминала, запустите его в фоновом режиме, например:

  yes | wc -c &

Во время выполнения этой команды выполните vmstat 1 5 и убедитесь, что она показывает, что система использует ЦП.

Теперь запустите команду, которую ваша программа сообщает Python:

  vmstat|tail -1

Сделайте это несколько раз.Это скажет вам, почему ваша программа всегда показывает одинаковые цифры.Это потому, что vmstat без аргументов всегда показывает одинаковые цифры.

Ну, технически это не совсем так, он не всегда показывает одинаковые значения.Эти значения могут медленно меняться со временем.На самом деле происходит следующее (скопировано со справочной страницы vmstat):

vmstat сообщает информацию о процессах, памяти, поисковом вызове, блочном вводе-выводе, ловушках, дисках и активности процессора.

В первом созданном отчете приводятся средние значения с момента последней перезагрузки.

Если ваша система некоторое время работала, то для изменения средних значений, отображаемых на этом, потребуется много действий.Первая строка.

Чтобы исправить, измените вашу программу на Python на vmstat 1 2|tail -1.(Выполните это самостоятельно пару раз, чтобы убедиться, что оно показывает то, что вы хотите, чтобы оно показывало.) Очевидно, что для накопления и выдачи обновленных данных потребуется секунда, но для целей этой программы это, вероятно, приемлемо.В зависимости от того, насколько чувствительным должен быть ваш мониторинг, вы можете даже попросить vmstat производить выборку в течение более длительного периода.

Не забудьте убить процессорное время, которое работает в фоновом режиме или в некоторых случаях.другой терминал.

...