парсинг вывода команды 'w'? - PullRequest
0 голосов
/ 06 марта 2011

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

Это университетское задание, и я обязаниспользуйте команду w.Мне трудно разбирать эту команду, потому что она очень многословна.Буду признателен за любые предложения о том, что я могу сделать.Это небольшая часть программы, и я могу свободно использовать любой метод, который мне нравится.

Наиболее сжатая версия w, в которой все еще есть нужная мне информация, это `w -u -s -f ', котораяпроизводит это:

 10:13:43 up  9:57,  2 users,  load average: 0.00, 0.00, 0.00
 USER     TTY         IDLE WHAT
 fsm      tty7      22:44m x-session-manager
 fsm      pts/0      0.00s w -u -s -f

Итак, меня интересует первое число после средней загрузки и наименьшее время простоя (поэтому мне нужно будет проанализировать их все).

Myфоновый процесс вызовет w, поэтому тот факт, что w является самым низким временем простоя, не имеет значения (все, что я увижу, это время tty).

У вас есть идеи?

Спасибо

(мне разрешено использовать альтернативные команды Unix, например, grep, если это поможет).

Ответы [ 3 ]

0 голосов
/ 06 марта 2011
  • Проверить: http://www.gnu.org/s/libc/manual/html_node/Regexp-Subexpressions.html#Regexp-Subexpressions
  • Используйте регулярные выражения для совпадения [0-9]+\.[0-9]{2} в первой строке.Возможно, вам придется возиться с тем, какие символы экранированы.Это даст вам 3 средних значения нагрузки.
  • Остальные выходные данные основаны на столбцах, поэтому, если вы отсчитаете позиции строк из w, вы сможете просто набрать интересующие биты.

Другая возможная теория (которая звучит так, как будто она противоречит назначению, но я бы об этом помнил) - это взять исходный код w и взломать его, чтобы просто сообщить вам информацию с помощью вызовов функций.Если вы чувствуете себя действительно хардкорным, вы можете выучить все вызовы API библиотеки и сделать это напрямую таким образом.

0 голосов
/ 06 марта 2011

Я обнаружил, что могу использовать комбинацию команд примерно так:

w -u -s -f | grep load | cut -d "" -f 11

и

w -u -s -f | grep tty | cut -d "" -f 13

первый получает вывод w, использует grep для выбора только строки с загрузкой, а затем обрезает все, кроме 11-го блока данных (разделитель - пробел), который является первым номером загрузки с запятой.

второй делает нечто подобное, только для пользовательской загрузки. И если есть несколько загрузок, это список.

Это достаточно просто для анализа, если у кого-то нет возражений или предложений по его улучшению.

0 голосов
/ 06 марта 2011

Вам разрешено использовать другие команды Unix?Вы можете использовать grep, sed или head / tail, чтобы получить нужные вам строки, и cut, чтобы разделить их по мере необходимости.

...