为什么 systemd 启动的进程的行为与交互启动时的行为不同?

Bra*_*tes 5 linux pthreads systemd

我有一个程序,它生成一个实时线程,代码如下:

schparam.sched_priority = sched_get_priority_max(SCHED_FIFO);
getrlimit(RLIMIT_RTPRIO , &rlim);
rlim.rlim_cur = schparam.sched_priority;
setrlimit(RLIMIT_RTPRIO , &rlim);
result = pthread_setschedparam(pthread_self(),SCHED_FIFO, &schparam);
if(result != 0 )
    printf("failed to set priority\n");
Run Code Online (Sandbox Code Playgroud)

我的默认系统限制不允许 RT 调度线程,因此我需要调用 setrlimit 来提高此值。当我登录到 root shell 并手动启动程序时,上面的代码可以按预期工作。

但是,当我让 systemd 在启动时自动启动程序时,计划设置失败并出现权限错误。从返回值和进程内对 getrlimit 的后续调用来看,setrlimit 调用似乎有效。但是 pthread_setschedparam 调用似乎没有意识到限制已经增加。

当我手动启动程序时,这一切都工作正常。我在这里缺少什么?

ema*_*ema 4

默认情况下,systemd 设置LimitRTPRIO=0. 您可以使用 来验证这一点systemctl show $servicename | grep LimitRTPRIO

如果 RLIMIT_RTPRIO 软限制为 0,则唯一允许的更改是降低优先级或切换到非实时策略。

按照 Siosm 的建议进行更改LimitRTPRIO,例如LimitRTPRIO=infinity在您的单元文件中应该可以解决问题。