Команде notify-send
необходимо установить переменную окружения DBUS_SESSION_BUS_ADDRESS
, и она должна вызываться владельцем этой сеансовой шины в качестве пользователя.
В следующем скрипте функция notify_users
ищет все демоны dbus -, которые управляют сеансовой шиной. Командная строка такого демона выглядит так:
dbus-daemon --fork --session --address=unix:abstract=/tmp/dbus-ceVHx19Kiy
Для этого процесса определяется владелец и адрес dbus. Тогда мы можем использовать notify-send
. Этот сценарий должен информировать всех пользователей, вошедших в систему с помощью сеанса GDM. Но я никогда не проверял это.
Примечание. :Если вы вызываете это как не -root, у вас может быть запрошен пароль из-за использования sudo
.
#!/bin/bash
# Inform all logged on users
# Usage: notify_users TITLE MESSAGE [urgency [icon]]
notify_users()
{
typeset title="$1"
typeset message="$2"
typeset urgency="${3:-critical}"
typeset icon="${4:-}"
case "$urgency" in
"low") : ;;
"normal") : ;;
"critical") : ;;
*)
urgency="normal"
;;
esac
typeset ls user bus_addr
typeset IFS=$'\n'
# for all dbus-daemon processes that create a session bus
for ln in "$(ps -eo user,args | grep "dbus-daemon.*--session.*--address=" | grep -v grep)"; do
# get the user name
user="$(echo "$ln" | cut -d' ' -f 1)"
# get dbus address
bus_addr="$(echo "$ln" | sed 's/^.*--address=//;s/.*$//')"
# run notify-send with the correct user
DBUS_SESSION_BUS_ADDRESS="$bus_addr" sudo -u $user -E /usr/bin/notify-send -u "$urgency" -i "$icon" "$title" "$message"
done
}
state="$(upower -i $(upower -e | grep BAT))"
# if the state contains the word "discharging"
if [[ "$state" = *discharging* ]]; then
perc=$(echo "$state" | grep "percentage" | awk '{print $2}' | tr -d '%')
icon="$(echo "$state" | grep "icon-name:" | awk '{print $2}' | tr -d "'\"" )"
if [ "$perc" -lt 15 ]; then
notify_users "Battery Low!" "Please plugin charger... charge is only $perc%" "critical" "$icon"
fi
fi
Я отвечаю в другом порядке, чтобы мои ответы имели больше смысла.
Не совсем так. Терминал — это не блочное устройство, а символьное устройство. Вы записываете один байт в файл устройства, что в конечном итоге приводит к тому, что UART становится активным для передачи битов. Процесс повторяется для нескольких байтов.
Да, есть верхний предел. Буферы существуют в аппаратном и программном обеспечении. Если вы пишете на tty быстрее, чем он может передать, буферы заполняются и записывают операционные блоки.Точные размеры не знаю. Я ожидаю, что размер буфера 1 (может записывать только один байт за раз ).
Насколько я знаю, tty по умолчанию не выводят эхо. При чтении из файла tty операция блокируется до тех пор, пока байт не будет получен извне.
Терминал знает только байты. Нет «сырых» или «приготовленных» байтов.
Обычно вы не читаете из буфера записи, так что это не имеет значения.
Во всех этих ответах предполагается, что tty настроен с помощью IOCTL.