Debian はバッテリー不足の警告を発行しません

Debian はバッテリー不足の警告を発行しません

私のDebian 10(Buster)は、ディスプレイにバッテリー不足の警告を表示せず、1%のバッテリー警告のみを表示します。
また、バッテリーが15%未満に低下した場合、警告を送信するために1分ごとに実行されるクローンジョブも作成しました。しかしそれは真実ではない。これは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-BusにアクセスするためにDBUS_SESSION_BUS_ADDRESS必要な環境変数を取得できないことを意味します。notify-send

この変数のKDEのデフォルト値はunix:path=/run/user/<your_UID>/busDebian 10にあり、/run/user/<your_UID>/ユーザーアカウントでのみアクセスできます。 Gnomeの場合は状況が異なるようです。unix:abstract=/tmp/dbus-0VDJayoNDs,guid=9897d6d93070adc85634b1fb5f631033ログインするたびに変わるようです。

したがって、アカウントでクローンジョブが実行されている場合は、次のことができます。

まず、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

次に、クローン操作を次のようにします。

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

関連情報