私の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