Debian не предупреждает о низком заряде батареи

Здесь используются не регулярные выражения, а шаблоны подстановки имен файлов.

[...]всегда будет соответствовать только одному символу (это происходит одинаково между шаблонами подстановки имен файлов и регулярными выражениями ), поэтому он не соответствует трем символамcho([cho]означает «один из c, hи o").

Чтобы сопоставить все имена, начинающиеся с a., используйте a.*.

Чтобы сопоставить все имена, начинающиеся с a., а затем сразу заканчивающиеся на c, h, oили cho, сначала установите параметр оболочки extglobс shopt -s extglobи используйте a.@([cho]|cho).

Раскрытие фигурных скобок, например a.{c,h,o,cho}, будет генерировать имена файлов в командной строке, но не дает гарантии, что эти файлы действительно существуют.

0
17.09.2020, 08:35
1 ответ

Любые программы, запускаемые из задания cron, не являются частью сеанса вашего рабочего стола, поэтому они могут работать вне зависимости от того, вошли вы в систему или нет.

Это означает, что они не получат DBUS_SESSION_BUS_ADDRESSпеременную окружения,который необходим notify-sendдля доступа к сеансу D -Bus, чтобы он мог отправить уведомление.

Значением по умолчанию для этой переменной для KDE, по-видимому, является unix:path=/run/user/<your_UID>/busв Debian 10, и /run/user/<your_UID>/доступно только для вашей учетной записи пользователя. Для Gnome это кажется другим :что-то вроде unix:abstract=/tmp/dbus-0VDJayoNDs,guid=9897d6d93070adc85634b1fb5f631033, и я предполагаю, что оно меняется при каждом входе в систему.

Итак, если задание cron запущено для вашей учетной записи, вы можете сделать что-то вроде этого:

Сначала создайте сценарий, который будет запускаться при входе в систему через графический интерфейс. Поместите его где угодно, например. ~/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
1
18.03.2021, 23:04

Теги

Похожие вопросы