You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 08:10:24