0

我有一个 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 决定rpath如果程序具有额外的功能,则不应允许它们从中加载库。

有没有办法让我设置自己的优先级加载 rpath 库?

注意:我更喜欢在应用程序或postinst. 我想避免将脚本部署为启动应用程序的唯一方法。我知道sudo chrt -f -p 70 $!可以从脚本中做到这一点。

4

1 回答 1

0

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

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

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

    然后从我们的应用程序启动sudo作为一个带有参数的进程chrt -f -p X YwhereX是配置的优先级并且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

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

于 2018-07-18T12:15:49.873 回答