데비안은 배터리 부족 경고를 발행하지 않습니다

데비안은 배터리 부족 경고를 발행하지 않습니다

내 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

관련 정보