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() с вызовом для запуска другого процесса напрямую.

  1. Установить файл в /etc/sudoers.d/ со следующей строкой:

    %users ALL=NOPASSWD: /usr/bin/chrt
    

    Тогда из нашего запуска приложения sudo как процесс с аргументами chrt -f -p X Y где X настроенный приоритет и Y является результатом getpid(),

  2. Создать кастом 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

Не уверен, какое решение лучше. Обратите внимание, что это эффективно встроено (или, по крайней мере, специально построено), поэтому я не слишком беспокоюсь о безопасности.

Другие вопросы по тегам