我有一个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 $!
可以通过脚本来完成。
答案 0 :(得分:0)
我有两种不涉及修改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
不确定哪种解决方案更好。请注意,它是有效嵌入的(或至少是专用的),因此我不必担心安全隐患。