Ubuntu22下systemd运行PyGame Mixer脚本遇ALSA欠载问题
问题解决:Systemd运行PyGame音频脚本出现ALSA Underrun错误
核心原因
你遇到的问题确实和桌面系统的音频会话有关:
- 手动运行脚本时,你处于桌面用户会话中,PulseAudio已作为用户级守护进程运行,PyGame可以通过PulseAudio正常访问音频设备。
- 而systemd的
multi-user.target或CRON运行的脚本,处于无桌面的系统会话,无法接入用户的PulseAudio会话,PyGame尝试直接用ALSA访问声卡时,会被桌面会话中正在运行的PulseAudio占用,从而触发underrun错误。
解决方案
1. 修改Systemd服务配置,接入桌面会话
将服务绑定到桌面启动目标,并继承用户的桌面环境变量:
[Unit] Description=Audio Server After=graphical.target pulseaudio.service [Service] Restart=on-failure WorkingDirectory=/home/user/audio # 继承桌面会话的显示和认证信息 Environment=DISPLAY=:0 Environment=XAUTHORITY=/home/user/.Xauthority ExecStart=/usr/bin/python3 -u /home/user/audio/soundServer.py User=user Type=simple [Install] WantedBy=graphical.target
graphical.target确保服务在桌面完全启动后运行,替代原来的multi-user.targetDISPLAY和XAUTHORITY环境变量让服务能访问用户的桌面会话资源,包括PulseAudio
2. 强制PyGame使用PulseAudio驱动
在Python脚本开头添加环境变量设置,让PyGame Mixer优先通过PulseAudio播放:
import os # 指定PulseAudio作为音频驱动 os.environ['SDL_AUDIODRIVER'] = 'pulse' import pygame pygame.mixer.init() # 你的音频播放代码...
这样可以避免PyGame直接调用ALSA,而是通过PulseAudio的用户会话来处理音频,彻底解决设备占用冲突。
3. 验证配置
修改后重新加载服务并启动:
sudo systemctl daemon-reload sudo systemctl enable --now audio-server.service
查看服务状态和日志确认是否正常:
systemctl status audio-server.service journalctl -u audio-server.service -f
额外说明
- 不需要
ExecStartPre=/bin/sleep 5,After=graphical.target已经能确保依赖服务启动完成 - 修改
/etc/pulse/daemon.conf的参数对用户会话生效,但系统级服务无法直接受益,因此不是有效解决方案
内容的提问来源于stack exchange,提问作者Razvan Levarda
相关产品推荐
相关产品推荐

