运行自定义脚本的 crontab 没有声音

Dav*_*erd 3 sound cron pulseaudio

#! /bin/bash

# Read battery percentage value
OUT=`upower -i /org/freedesktop/UPower/devices/battery_BAT1 | grep percentage`

# Select only the int value
IFS=':' read -ra P <<< "$OUT"
PERCENTAGE="%"
BATTERY_VALUE=${P[1]%$PERCENTAGE}

# Send a notification if battery level is under 15% and not on AC power
if ! on_ac_power; then
  if (($BATTERY_VALUE  < "15")); then
      eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gnome-session)/environ)";
      notify-send -u critical -i "battery-caution" "Battery low! You should plug in your laptop!"
      /usr/bin/aplay /usr/share/sounds/desktop-logout.oga
  fi
fi

# Send a notification if battery level is equal to or over 90% and is on AC power
if on_ac_power; then
  if (($BATTERY_VALUE  >= "90")); then
      eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gnome-session)/environ)";
      notify-send -u critical -i "battery-full-charging" "Battery charged! You should unplug your laptop!"
      /usr/bin/aplay /usr/share/sounds/desktop-logout.oga
  fi
fi
Run Code Online (Sandbox Code Playgroud)

如果我手动执行脚本,声音和脚本工作正常。我从notify-send 收到通知,但它不从crontab 播放声音。Cron 日志说:

Connection failure: Connection refused
pa_context_connect() failed: Connection refused. 
Run Code Online (Sandbox Code Playgroud)

我已经尝试过该命令paplay并指向paplay的绝对路径,但/usr/bin/paplay无济于事。

小智 5

我发现当我应该在命令行中使用pulseaudio发送声音给另一个用户时,您应该指定环境变量:

XDG_RUNTIME_DIR="/run/user/usr_id"
Run Code Online (Sandbox Code Playgroud)

将“usr_id`”替换为与用户相对应的 id(数字)(此处如何在 crontab之外获取它)。

定时任务示例:

* * * * * XDG_RUNTIME_DIR=/run/user/$(id -u) /path/to/script
Run Code Online (Sandbox Code Playgroud)

它将自动使用当前用户 ID。

问题似乎是 crontab 的环境非常有限。

来源ArchLinux 维基:PulseAudio