내 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>/bus
Debian 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