Bash

Debian 不會提醒電池電量不足

  • September 17, 2020

我的 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-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

引用自:https://unix.stackexchange.com/questions/609794