Debian 不會提醒電池電量不足
我的 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
。任何線索有什麼問題?
從 cron 作業執行的任何程序都不屬於您的桌面會話,因此無論您是否登錄,它們都可以執行。
這意味著他們不會獲得訪問會話 D-Bus
DBUS_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