#!/bin/bash
export DISPLAY=:0
state=$(upower -i $(upower -e | grep BAT) | grep --color=never -E "state" )
stat=${state:25:32}
batperct=$(upower -i $(upower -e | grep '/battery') | grep -E "percentage:")
bat=${batperct:24:26}
intbat=$(echo $bat | cut -d'%' -f1)
if [ "$intbat" -lt "15" -a "$stat" == "discharging" ]; then
notify-send 'battery low..! please plugin charger..... charge is only' "$intbat"
fi
当以普通用户 ( ) 身份运行时,脚本运行良好bash script.sh
。将显示桌面通知。
root
如果我运行它sudo bash script.sh
,桌面通知是不是显示。
如何以 root 身份使用 notification-send 通知用户?
我正在使用 Arch Linux。
答案1
该命令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