如何以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守护进程,但最终得到的结果与我刚才描述的相同。
我的文件/etc/security/limits.d/audio.conf如下:
@audio   -  rtprio     95
@audio   -  memlock    unlimited
#@audio   -  nice      -19

我试图启动jackd的用户属于音频组。
有没有办法让新贵开始一个实时的过程?如果没有,这个问题还有别的解决办法吗?
谢谢您。


最佳答案:

/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