问题
今天碰到了程序在 linux 上面运行权限的问题。情况如下:
- 用户直接运行,ok
- sudo 运行,报错: _simpleaudio.SimpleaudioError: Error opening PCM device. – CODE: -16 – MSG: Device or resource busy
- 作为用户服务启动,报错: Failed to determine supplementary groups: Operation not permitted. Failed at step GROUP spawning /usr/bin/python3: Operation not permitted
- 作为系统服务启动,报错: _simpleaudio.SimpleaudioError: Error opening PCM device. – CODE: -16 – MSG: Device or resource busy
原因
- 直接运行时:继承用户完整的会话环境(包括 PULSE_SERVER 等音频相关变量)
- sudo 运行时:环境变量被重置,且无法访问用户级的 PulseAudio 服务
调试
环境变量
直接给环境变量是可以运行的.
sudo -E PULSE_SERVER=unix:/run/user/$(id -u lckfb)/pulse/native DISPLAY=:0 XDG_RUNTIME_DIR=/run/user/$(id -u lckfb) /usr/bin/python3 /userdata/Possessed_AI-34323ff/chat_with_robot.py --kws local_streaming --use_action lite3 --with_agent True --echo_cancel True --det_log 1 --chat_log 2
系统服务
必要的 id
- uid:
id -u lckfb
# 获取用户UID(假设输出1000) - gid:
getent group audio
# 获取audio组GID(通常为29或audio) /run/user/1000/pulse
目录存在,并且/run/user/1000
属于用户
服务文件指明 id
[Service]
...
#User=lckfb
User=1000
#Group=audio
Group=29
#Environment="PULSE_SERVER=unix:/run/user/%U/pulse/native"
Environment="PULSE_SERVER=unix:/run/user/1000/pulse/native"
#Environment="XDG_RUNTIME_DIR=/run/user/%U"
Environment="XDG_RUNTIME_DIR=/run/user/1000"