Ubuntu 22下Crontab启动脚本无法连接PulseAudio问题排查
问题:Crontab启动脚本无法连接PulseAudio,手动运行正常
我在Ubuntu 22的家庭影院PC(HTPC)上部署了一套脚本,用来检测以下内容:
- 键鼠最后活动时间
- 是否有音频正在播放(音乐或视频)
脚本会根据检测结果判断HTPC是否处于空闲状态,并将信息上报至家庭自动化服务器。
我写了一个辅助脚本start_idle_report.sh,用来在系统启动时通过tmux会话启动主脚本(方便附加会话调试,因为脚本会把输出打印到终端)。
以主用户htpc身份手动运行脚本时一切正常,但通过crontab启动时,PulseAudio会提示No PulseAudio daemon running, or not running as session daemon。查看ps输出,两种方式运行的进程都是htpc用户身份。
手动SSH启动的ps输出
htpc@htpc:~/Documents$ ps aux | grep -i idle htpc 8397 0.0 0.0 11308 3736 ? Ss 00:03 0:00 tmux new-session -d -s idle-script exec /home/htpc/Documents/report_idle_to_hass.sh htpc 8398 0.0 0.0 10100 4012 pts/2 Ss+ 00:03 0:00 /bin/bash /home/htpc/Documents/report_idle_to_hass.sh htpc 8455 0.0 0.0 9208 2180 pts/3 S+ 00:03 0:00 grep --color=auto -i idle
Crontab启动的ps输出
htpc@htpc:~/Documents$ ps aux | grep -i idle htpc 6720 0.0 0.0 11304 3604 ? Ss 23:57 0:00 tmux new-session -d -s idle-script exec /home/htpc/Documents/report_idle_to_hass.sh htpc 6721 0.0 0.0 10100 3988 pts/2 Ss+ 23:57 0:00 /bin/bash /home/htpc/Documents/report_idle_to_hass.sh htpc 6748 0.0 0.0 9208 2416 pts/3 S+ 23:57 0:00 grep --color=auto -i idle
从视觉上看不出两者运行结果不同的原因。
手动启动的tmux会话输出
Counter overflowed: No [][] Counter overflowed: No [][]
注:[][]是家庭自动化服务器的空响应,表示状态未发生变化;若状态变化,会填充之前的状态信息。
Crontab启动的tmux会话输出
Counter overflowed: Yes [][] No PulseAudio daemon running, or not running as session daemon. No PulseAudio daemon running, or not running as session daemon. No PulseAudio daemon running, or not running as session daemon. No PulseAudio daemon running, or not running as session daemon. No PulseAudio daemon running, or not running as session daemon. No PulseAudio daemon running, or not running as session daemon. No PulseAudio daemon running, or not running as session daemon. No PulseAudio daemon running, or not running as session daemon. No PulseAudio daemon running, or not running as session daemon. No PulseAudio daemon running, or not running as session daemon. No PulseAudio daemon running, or not running as session daemon. Counter overflowed: Yes [][] No PulseAudio daemon running, or not running as session daemon. No PulseAudio daemon running, or not running as session daemon.
Crontab条目(通过crontab -e编辑)
@reboot exec /home/htpc/Documents/start_idle_report.sh
相关脚本内容
check_idle.sh(问题出在这里,仅pacmd命令无法正常工作,其他功能正常)
#!/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin export DISPLAY=:0.0 # Set the timeout value to consider device idle time_to_be_idle_ms=60000 audio_check="`exec pacmd list-sink-inputs | grep \"state: RUNNING\"`" idle_time="`exec xprintidle`" current_app="`exec xdotool getwindowfocus getwindowname`" if [ -z "$audio_check" ] then if [ "$idle_time" -gt "$time_to_be_idle_ms" ] then if [[ "$current_app" == *"Frigate"* ]] then # No audio, idle time, but cameras are in focus echo "No" else # No audio, idle time, and cameras aren't in focus echo "Yes" fi else # No audio playing, but idle time not met echo "No" fi else # Playing audio echo "No" fi
start_idle_report.sh
#!/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # Kick off the report script if [[ "`ps aux | grep -i report_idle_to_hass | wc -l`" -eq "1" ]]; then tmux new-session -d -s "idle-script" "exec /home/htpc/Documents/report_idle_to_hass.sh" fi
report_idle_to_hass.sh(部分信息已脱敏)
#!/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin submit_state() { # This function sends the desired output to my server } submit_state "No" last_state="No" counter=0 while [ true ] do idle_check="`/home/htpc/Documents/check_idle.sh`" if [[ "$idle_check" != "$last_state" ]] then echo "States changed: $idle_check" submit_state "$idle_check" last_state="$idle_check" counter=0 else counter=$((counter+1)) fi if [ "$counter" -gt 10 ] then echo "Counter overflowed: $last_state" submit_state "$last_state" counter=0 fi sleep 2 done
排查过程
- 查阅PulseAudio连接机制文档,提到多个环境变量,但用
printenv查看时未发现任何与显示或PulseAudio相关的变量;无~/.pulse配置文件夹,/etc/pulse下的默认配置文件仅含注释内容。 - 怀疑路径问题,确认
pacmd路径为/usr/bin/pacmd,且脚本已定义PATH,排除路径问题。 - 尝试过添加/移除
exec命令,无效。
核心疑问
为什么手动运行脚本时能找到PulseAudio服务器,而通过crontab启动时却不行?感觉问题大概率和用户身份或环境变量有关。
内容的提问来源于stack exchange,提问作者Jon V
相关产品推荐
相关产品推荐

