如何使用暴发户启动具有实时优先级(jackd)的进程?

Posted

技术标签:

【中文标题】如何使用暴发户启动具有实时优先级(jackd)的进程?【英文标题】:How to start a process with realtime priority (jackd) with upstart? 【发布时间】:2014-10-14 06:19:11 【问题描述】:

我正在尝试使用 upstart 脚本在启动时以实时优先级启动 jackd,但到目前为止没有成功。我正在使用 ubuntu 服务器 14.04。我的暴发户版本是1.12.1。

如果我在没有实时的情况下启动 jackd,upstart 脚本会按预期工作。 我用来在脚本中启动 jackd 的用户和组被允许使用实时优先级,但是当 upstart 运行它时似乎并不重要。每当我尝试通过 upstart 运行它时,我都会在 upstart 日志中得到这个:

jackdmp 1.9.10
Copyright 2001-2005 Paul Davis and others.
Copyright 2004-2013 Grame.
jackdmp comes with ABSOLUTELY NO WARRANTY
This is free software, and you are welcome to redistribute it
under certain conditions; see the file COPYING for details
Cannot create thread 1 Operation not permitted
Cannot create thread 1 Operation not permitted
Cannot create thread 1 Operation not permitted
JACK server starting in realtime mode with priority 70
Cannot lock down 82274202 byte memory area (Cannot allocate memory)
Cannot create thread 1 Operation not permitted
ERROR: messagebuffer not initialized: libffado 2.1.9999- built Oct 19 2013 16:01:07
ERROR: messagebuffer not initialized: 1408466326248438: Error (PosixThread.cpp)[ 161] Start: Cannot create realtime thread (1: Operation not permitted)
ERROR: messagebuffer not initialized: 1408466326248486: Error (PosixThread.cpp)[ 162] Start:  priority: 75
firewire ERR: FFADO: Error creating virtual device
Cannot attach audio driver
JackServer::Open failed with -1
Failed to open server

如果我只是在终端中运行 upstart 脚本的 exec 行中的相同命令,它就可以正常工作。

我的新贵脚本很简单:

description "jackd"

start on stopped rc
stop on runlevel [06]


exec su radiola -c "jackd -R -P 70 -d firewire -r 44100 -n 3 -p 2048"

我也尝试过使用 setuid 和 setguid 节以及 start-stop-daemon,但结果与我刚才描述的结果相同。 我的文件 /etc/security/limits.d/audio.conf 如下:

@audio   -  rtprio     95
@audio   -  memlock    unlimited
#@audio   -  nice      -19

我试图启动 jackd 的用户属于音频组。

有没有办法让暴发户启动一个实时进程?如果没有,是否有其他解决方案?

谢谢。

【问题讨论】:

【参考方案1】:

/etc/security/limits.d/audio.conf 文件仅在用户打开会话时读取(例如,在加载 pam_limits.so 时)。

您可以使用 limit 指令直接从 upstart 脚本中设置相同的限制:

limit memlock unlimited unlimited
limit rtprio 95 95

另外,为了切换到radiola,你可以使用setuid/setgid指令来代替su,

setuid radiola
setgid audio

【讨论】:

以上是关于如何使用暴发户启动具有实时优先级(jackd)的进程?的主要内容,如果未能解决你的问题,请参考以下文章

如何将我的单声道程序添加到启动中?

如何在python中杀死一个分叉的孩子及其jackd子进程

如何使用工头导出到暴发户?

码头工人在 scaleway 上的暴发户

通过板载耳机插孔使用 ALSA + Jackd2 时,Raspberry Pi 3 A+ 音频失真/尖叫

11 进程及其优先级别