LINUX.ORG.RU

Почему скрипт так сильно нагружает процессор? (РЕШЕНО)

 


0

1

Собственно простенький скрипт выводящий температуру soc:

for  ((;;))
	do
		sensors | grep temp6 
done | osd_cat -c red -s 2 -f -*-*-*-*-*--20-*-*-*-*-*-*-* -l 1

Нагружает процессор как будто я что-то тяжелое запустил.

Почему так и как уменьшить нагрузку?

★★

Последнее исправление: Vochatrak-az-ezm (всего исправлений: 1)

А посмотри, сколько у тебя вызывается sensors в минуту? ))
sleep там поставить?

Oldboy
()

Правильный ответ (точнее намёк) уже дали выше. Я немного займусь перфекционизмом.

for ((;;))

Заменить на

while true

Kroz ★★★★★
()

Oldboy Jameson

Спасибо, получше стало.

Vochatrak-az-ezm ★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

Только для тех, кому почему-то нравится паскалевская «эстетика». А вообще-то, что for (;;) в сях, что приведённый его аналог в баше — уж сто лет как являются идиомами для «forever» и рекомендуются к использованию.

alegz ★★★★
()
Ответ на: комментарий от Kroz

Для префекциониста было бы логичнее вынести grep из цикла:

while sensors ; : ; do sleep 1 ; done | grep -F temp6 |
osd_cat -c red -s 2 -f -*-*-*-*-*--20-*-*-*-*-*-*-* -l 1

ABW ★★★★★
()
Последнее исправление: ABW (всего исправлений: 1)
Ответ на: комментарий от alegz

Кем рекомендуются? Не пиши ерунду, это личные вкусы. Лично я всегда while(1) пишу и вообще не использую for без осмысленного второго аргумента.

firkax ★★★★★
()

Покажи мне строчку твоего скрипта, где ты считаешь, что процессор будет отдыхать? Я вижу только бесконечный непрерывный опрос датчиков.

ox55ff ★★★★★
()
Ответ на: комментарий от alegz

Голосом Морфеуса «А что если я тебе скажу, что это не паскалевская, а алголовская эстетика?» И этот твой for тоже из алгола, который повлиял на сишку, а не наоборот? (И для того «что в сях» Билл Джой специально написал csh, где это хотя бы не выглядело бы чужеродно... но там тоже циклы были внезапно не буквально такие как в сях :)) Просто сишка, откуда скобкота с точками с запятой, — это алголовские же конструкции со скобочными причудами дедов K&R «для экономии», придуманные во времена когда режим экрана 80x25 был роскошью на машинках меньше «нормального мейнфрейма» (во времена дековскийх TOPS10/20 и IBM System/360, юниксы это все было «вообще несерьезно», даже Bell Labs их считала ненужной фигней, придуманной гиками от безделья на потеху другими гиками из универов — коммерческий потенциал осознали потом, когда запахло «недополученным баблом».

Более того, в shell, который bash «возрождал» изначально, никаких смайликов этих ((;;)) нет :) И в csh их не было :) Скобки эти несовместимы со стандартом posix 1003.2 (и в баше, что характерно, есть режим где их нет, а чот не наоборот, т.е. это именно что неродной синтаксис, кем он там от дури/лени/эстетства рекомендуется. Т.е. эти «неортодоксальные башизмы» — непереносимые расширения в угоду «эстетствующим» с сями головного мозга.

А это вот про «сто лет» — «торопиться не надо» (с) Для почти всего в ойти это слишком гипербола, т.к. еще живы люди, которые помнят когда никакого ойти вообще не было, были отдельные компы для старой доброй математики и протирки контактов спиртом, а у большинства людей в странах где были эти компы, кушоц было не каждый день, не то что до сортов расширений баша :)

Алсо, Гашек все знал про эстетов еще тогда. А бабка Лиза как раз после его смерти через пару лет родилась.

slackwarrior ★★★★★
()
Ответ на: комментарий от firkax

Ну хорошо,

  stdbuf -oL grep -F temp6
Но вообще-то если заботиться о ресурсе, проще вместо запуска sensors запускать 'cat /sys/class/hwmon/hwmonX/temp6_input', правда потом, наверное, придётся как-то препарировать это голое число.

ABW ★★★★★
()
Ответ на: комментарий от firkax

Лично я всегда while(1) пишу и вообще не использую for без осмысленного второго аргумента.

Вопрос исключительно вкуса / привычки. Я лично использую for (;;). Специально проверил - даже с -O0 asm абс идентичен.

bugfixer ★★★★★
()
Ответ на: комментарий от bugfixer

Конечно идентичен, иначе и быть не могло. Я ж написал дело личного вкуса, а вот комментатор на которого я отвечал считает что какая-то там «рекомендуется».

firkax ★★★★★
()
Ответ на: комментарий от alegz

А вообще-то, что for (;;) в сях … уже сто лет как являются идиомами для «forever» и рекомендуются к использованию.

Бредятина.

fornlr ★★★★★
()
Последнее исправление: fornlr (всего исправлений: 1)

прочитал как «почему скрипит процессор»

Извините.

burato ★★★★★
()

Вроде как в bash нет команды true, она является внешней, поэтому true в bash говно.

naKovoNapalBaran
()

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

naKovoNapalBaran
()

Замени for ((;;)) на while sleep 1, или даже while sleep 5 — нафиг оно тебе каждую секунду. В нынешнем варианте процу, собственно, отдыхать и некогда.

CrX ★★★★★
()

Так народ, а раз уж речь зашла, подскажите - как лучше менять надпись temp на soc?

Первое что пришло в голову это | sed 's/temp6/Soc/'

В принципе то оно работает, но может как то повменяемее?

Vochatrak-az-ezm ★★
() автор топика
Ответ на: комментарий от Vochatrak-az-ezm

Да в принципе так вполне вменяемо. Только тогда, если уж всё равно sed вызывать, можно от grep отказаться и обойтись одним только sed: | sed -n 's/temp6/Soc/p'

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 3)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.