Интересная головоломка.

Хм, попалась мне головоломка из практики… промучался с ней, к своему стыду, где то минут 40.

Задача, в perl-скрипте одной строчкой получить загрузку системы по ЦПУ.

Вот что первое приходит в голову:

if (`top -n 1 | grep Cpu`=~ /(\S+)\%id/) {print $1;}

Но, вроде на первый взгляд все правильно… а не работает. Вот почему не работает я и потратил около 40 минут, отя проблема то пустяшная. 🙂
Решение далее

Я сначала думал что проблема в регулярном выражении, но оказывается проблема в выводе top. Проблема решилась просто — добавлением параметра -p к top-у. то есть теперь эта строчка выглядит так:
if (`top -p -n 1 | grep Cpu`=~ /(\S+)\%id/) {print $1;}
Вот так вот.
Далее, наверное более правильное (четкое) соответствие будет если строчка будет выглядеть так:
if (`top -p -n 1 | grep Cpu`=~ /([0-9\.]+)\%id/) {print $1;}
Следующим решением было отказаться от top и пользоваться утилитой vmstat:
print `vmstat | tail -n1 | awk ‘{ print $15 }’`;
Данная конструкция работает быстрее в 500 раз, чем top:
time (top -n1 -b | grep Cpu) # 0m0.508s
time (vmstat | tail -n1 | awk ‘{ print $15 }’) # 0m0.001s
Единственный минус использования vmstat в том что она выдает результаты без дробных частей. Но с этим можно смириться.
За сим все.

Интересная головоломка.: 2 комментария

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

CAPTCHA image
*