Я играл с cset, чтобы установить соответствие процессора для запущенных процессов. Я воссоздаю встроенную функцию «щита» вручную с помощью set и proc, чтобы добавить некоторые подмножества для определенных потоков моего приложения. У меня есть сценарий bash, который вызывает cset для создания наборов и перемещения правильных потоков в правильные наборы. Работает при запуске с sudo.
Теперь я хотел бы сделать этот скрипт исполняемым другим пользователем, у которого нет полномочий sudo. Я достаточно доверяю этому пользователю, чтобы отвечать за cset, но не хочу раскрывать широкие возможности root.
Я думал, что CAP_SYS_NICE - который необходим для sched_setaffinity, который, как я полагаю, должен использовать cset - в сценарии будет достаточно, но это не сработало. Я попытался расширить CAP_SYS_NICE до программы cset (которая представляет собой тонкую оболочку python для библиотеки python cset). Никаких кубиков. Вывод cap_to_text в моих сценариях CAP_SYS_NICE'd: "= cap_ipc_lock, cap_sys_nice, cap_sys_resource + eip" (у него есть ipc_lock и sys_resource по другим причинам; я думаю, что только sys_nice имеет значение).
Любые идеи?
Я всегда думал о cset как об инструменте SuSE. Я использовал его на RHEL еще в EL5, но с EL6, cgroups являются предпочтительным методом экранирования.
Я бы, вероятно, пошел по маршруту sudo, ограничив доступ к конкретным командам, необходимым для размещения процессов ваших пользователей в щите.
Скорее просто дайте этому пользователю ограниченное разрешение sudo для запуска только этого сценария, например:
bob ALL=(root) NOPASSWD: /usr/local/bin/cset.sh
удалять NOPASSWD:
если вы хотите, чтобы пользователь аутентифицировался со своим паролем.
Хотя cgroups, кажется, заменяют cset / cpusets (как сказал ewwhite), я все равно продолжил использовать старый метод, потому что он был более знакомым и все еще работает.
Что касается проблемы с разрешением, моя конкретная проблема была решена путем использования cset для создания дерева внутри / cpusets, с которым я sudo chown -R root:myusergroup /cpusets/mytree
и sudo chmod -R g+rwX /cpusets/mytree
. После этого пользователи в myusergroup
могут перемещать процессы внутри дерева с помощью echo $MYPID >> /cpusets/mytree/subtree/tasks
. К сожалению, cset, похоже, не работает без полного разрешения для всех / cpusets - я считаю, что он пытается перечитывать весь каталог / cpusets каждый раз, когда вы запускаете команду, поэтому мне пришлось прибегнуть к этому ручному методу перемещения процессов.
Я не говорю, что это идеальное решение для всех, но оно сработало лучше всего с моим опытом и ситуацией.