[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Динамически включать-выключать CPU



On 2011.09.10 at 05:29:03 +0100, Mikhail Ramendik wrote:

> 2011/9/10 Victor Wagner <vitus@wagner.pp.ru>:
> 
> > Ну и то, что ты делаешь на python тоже прекрасно делается на shell.
> >
> > Есть в нем и read и for, и while
> 
> Мне нужно следующее:
> 
> - Считать содержимое /dev/cpuset/tasks в массив, по строчкам. И больше
> этот файл не трогать совсем. Массив должен быть в памяит (больше
> негде, файлова система read only)

Зачем тебе именно массив? Тебе нужна любая структура данных, по которой
можно итерировать. 

Насколько я понимаю, строчки в /dev/cpu/tasks пробелов и прочих
специсиволов не содержат.

Поэтому вполне сработает такая конструкция

LIST=`cat /dev/cpuset/tasks`
for pid in $LIST; do
 	echo $pid > /dev/cpyset/syscpuset/tasks
done

Командная строка с итерированием по аргументом - одна из самых
естественных конструкций для shell.

Если же в /dev/cpuset/tasks  в строчках встречаются специсимволы 
шелла (пробелы, кавычки и прочая фигня, которая помешает при
многократной подстановке, любимой шеллом)

то никто не мешает засунуть файл в переменную AS IS

LIST="`cat /dev/cpuset/tasks`"

а потом читать его из пайпа

echo "$LIST" | while read line; do 
	echo $line >/dev/cpuset/syscpyset/tasks
done	

Обрати внимание на кавычки вокруг бэктиков и подстановки $LIST в
аргументы echo.

> - Каждой строке массива отдельно сделать echo $string
> >/dev/cpuset/syscpuset/tasks . Ошибки игнорировать.
> 
> Я не смог нагуглить, как сделать это шеллом. Поэтому и сделал питоном.

А не надо такие вещи гуглить. Их надо головой думать. В смысле пытаться
разобрать операцию на элементарные составляющие, и пытаться выразить
их на требуемом языке. 

При этом всячески избегать использования ложных паттернов. Таких,
например, как "массив".

Потому что, хотя я даже не исключаю, что в том шелле, который работает
/bin/sh  на твоей конкретной машине, массивы есть (я, кстати, так за
десять лет существования шелловских массивов не научился ими
пользоваться), зарекаться на то, что в любом наугад взятом /bin/sh они
есть, не стоит.

> Если шеллом можно сделать _это_, может им можно и конфиг разобрать? В

Да, естественно.

Я очень часто делаю конфиги скриптами на том же языке, что и основной
продукт, и промом просто делаю им source/require и т.д.

Некоторые считатют, что тьюринг-полный язык конфигов да еще с
возможностью доступа в namespace основной программы - это vulnerability,
но я полагаю, что в большинстве случаев то, кто имеет право править
конфиг, имеет право править и программу. 

> этом случае даже production решение (для публикации) можно делать на
> шелле. Особенно если независимо от того сделать /sbin/kprint для
> выкидывания чего-нибудь в dmesg.

Как мне кажется, куда более прямым решением будет не /sbin/kprint а 
/dev/kprint - маленький такой ядерный модуль, предоставляющий character
devices, и передающий все, что туда пишется, в буфер сообщений ядра.

Дело в том, что для /sbin/kprint тебе все равно понадобится какой-то
интерфейс с ядром - просто так внутреннюю ядерную функцию ты из
userspace не позовешь. 

А если этот интерфейс сделать в виде character device (а это -
совершенно стандартный, документированный и снабженный кучей примеров
способ приделывания интерфесов к ядерным модулям), то в юзерспейсе тебе
ничего специального не понадобится - обычного echo хватит.



> 
> -- 
> Yours, Mikhail Ramendik
> 
> Unless explicitly stated, all opinions in my mail are my own and do
> not reflect the views of any organization


Reply to: