我的 Debian 10 (Buster) 不会在显示屏上发出低电量警报,它只发出 1% 的电量警报,这已经晚于插入充电器了。
我还创建了一个 cron 作业,每分钟运行一次,以在电池电量低于 15% 时发出警报。但事实并非如此。这是 cron 运行的 bash 文件:
battery_level=`acpi -b | grep -P -o '[0-9]+(?=%)'`
if [ $battery_level -le 4 ]
then
notify-send "Battery low" "Battery level is ${battery_level}%!"
mkdir ~/testing_if_bash_runs
fi
运行mkdir ~/testing_if_bash_runs
但notify-send
不运行。
有什么线索有什么问题吗?
答案1
从 cron 作业运行的任何程序都不属于您的桌面会话,因此无论您是否登录,它们都可以运行。
这意味着他们不会获得访问会话 D-BusDBUS_SESSION_BUS_ADDRESS
所需的环境变量notify-send
,因此它可以发送通知。
KDE 的该变量的默认值似乎是unix:path=/run/user/<your_UID>/bus
在 Debian 10 中,并且/run/user/<your_UID>/
只能由您的用户帐户访问。对于 Gnome 来说,情况似乎有所不同:类似的东西unix:abstract=/tmp/dbus-0VDJayoNDs,guid=9897d6d93070adc85634b1fb5f631033
,我猜它会在每次登录时发生变化。
因此,如果 cron 作业正在您的帐户上运行,您可能会执行以下操作:
首先,创建一个将在 GUI 登录时运行的脚本。~/bin/record-session-bus-address.sh
例如,将其放在您喜欢的任何地方。将其标记为可执行 ( chmod a+x ~/bin/record-session-bus-address.sh
)。脚本的内容应该是这样的:
#!/bin/sh
echo "$DBUS_SESSION_BUS_ADDRESS" > $HOME/.local/session_bus_address
chmod 600 $HOME/.local/session_bus_address
~/.config/autostart/record-session-bus-address.desktop
添加包含以下内容的文件:
[Desktop Entry]
Name=record-session-bus-address
GenericName=Record session bus address
Comment=Record session bus address for a cron job
Exec=~/bin/record-session-bus-address.sh
Terminal=false
Type=Application
X-GNOME-Autostart-enabled=true
然后让你的 cron 工作像这样:
battery_level=`acpi -b | grep -P -o '[0-9]+(?=%)'`
if [ $battery_level -le 4 ]
then
myUID=$(id -u)
if [ -f $HOME/.local/session_bus_address ]
then
# Faramarz may be logged in
export DBUS_SESSION_BUS_ADDRESS=$(cat $HOME/.local/session_bus_address)
# strip prefix and suffix to get the plain dbus socket name
DBUS_SOCKET_PREFIXED=${DBUS_SESSION_BUS_ADDRESS%%,guid=*}
DBUS_SOCKET_PLAIN=${DBUS_SOCKET_PREFIXED##unix:abstract=}
else
# Not logged in, make sure the next test fails
DBUS_SOCKET_PLAIN=/dev/definitely_does_not_exist
fi
if [ -w "$DBUS_SOCKET_PLAIN" ]
then
# Faramarz is definitely logged in, send a notification
notify-send "Battery low" "Battery level is ${battery_level}%!"
else
# Faramarz is not logged in, do something else.
# This example requires /etc/sudoers entry like this:
# Faramarz ALL=(root) NOPASSWD: /usr/bin/beep
sudo beep -l 1000 -f 2700 -n -l 1000 -f 2000 -n -l 1000 -f 1000
fi
fi