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

时间:2018-07-17 06:30:52

标签: scheduling linux-capabilities

我有一个Linux应用程序,它使用经过修改的rpath(在安装过程中设置)加载* .so库。它还需要以实时优先级运行。

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

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 decides不允许程序具有额外功能从rpath加载库。

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

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

1 个答案:

答案 0 :(得分:0)

我有两种不涉及修改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. 的进程

不确定哪种解决方案更好。请注意,它是有效嵌入的(或至少是专用的),因此我不必担心安全隐患。