Linux:设置进程优先级和动态加载库

Linux: setting process priority AND dynamically loading libraries

我有一个 linux 应用程序,它使用修改后的 rpath(在安装期间设置)加载 *.so 库。它还需要 运行 具有实时优先级。

要获得实时优先级,它会这样做:

sched_param sched;
sched.sched_priority = 70;
sched_setscheduler(getpid(), SCHED_FIFO, &sched);

然而 sched_setscheduler is a privilaged method, protected by the CAP_SYS_NICE capability. Therefore, to get realtime priority without running as root, I add setcap 我的 postinst:

setcap cap_sys_nice+ep /path/to/myapp

但是,linux decides 如果程序具有额外的功能,则不应允许它们从 rpath 加载库。

我可以设置自己的优先级 加载 rpath 库吗?

注意:我更愿意在应用程序或 postinst 中执行此操作。我想避免将部署脚本作为启动应用程序的唯一方式。我知道 sudo chrt -f -p 70 $! 可以通过脚本完成。

我有两个不涉及修改的解决方案libc。这两种解决方案都要求我们将对 sched_setscheduler() 的调用替换为直接启动另一个进程的调用。

  1. 使用以下行将文件安装到 /etc/sudoers.d/

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

    然后从我们的应用程序启动 sudo 作为参数为 chrt -f -p X Y 的进程,其中 X 是配置的优先级,Ygetpid() 的结果.

  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

  3. 的进程

不确定哪个解决方案更好。请注意,这是有效嵌入的(或至少是专门构建的),所以我不太担心安全风险。