Linux: установка приоритета процесса и динамическая загрузка библиотек
У меня есть приложение Linux, которое загружает библиотеки *.so, используя измененный rpath
(устанавливается во время установки). Он также должен работать с приоритетом в реальном времени.
Чтобы получить приоритет в реальном времени, он делает это:
sched_param sched;
sched.sched_priority = 70;
sched_setscheduler(getpid(), SCHED_FIFO, &sched);
тем не мение sched_setscheduler
является привилегированным методом, защищенным CAP_SYS_NICE
возможность. Поэтому, чтобы получить приоритет в реальном времени без запуска от имени root, я добавляю setcap
к моему postinst
:
setcap cap_sys_nice+ep /path/to/myapp
Тем не менее, Linux решает, что программы не должны загружать библиотеки из rpath
если у них есть дополнительные возможности.
Есть ли способ для меня установить свой собственный приоритет и загрузить библиотеки rpath?
Примечание: я бы предпочел сделать это в приложении или в postinst
, Я бы хотел избежать развертывания скриптов как единственного способа запуска приложения. я знаю sudo chrt -f -p 70 $!
мог сделать это из скрипта.
1 ответ
У меня есть два решения, которые не включают изменение libc
, Оба решения требуют от нас заменить звонки на sched_setscheduler()
с вызовом для запуска другого процесса напрямую.
Установить файл в
/etc/sudoers.d/
со следующей строкой:%users ALL=NOPASSWD: /usr/bin/chrt
Тогда из нашего запуска приложения
sudo
как процесс с аргументамиchrt -f -p X Y
гдеX
настроенный приоритет иY
является результатомgetpid()
,Создать кастом
chrt
с:cp $(which chrt) $(DESTDIR)/bin/chrt sudo setcap cap_sys_nice+ep $(DESTDIR)/bin/chrt sudo chmod 755 $(DESTDIR)/bin/chrt
Тогда из нашего запуска приложения
chrt
как процесс с аргументами-f -p X Y
Не уверен, какое решение лучше. Обратите внимание, что это эффективно встроено (или, по крайней мере, специально построено), поэтому я не слишком беспокоюсь о безопасности.