在我的系统上,notify-send
需要 3 个环境变量才能运行,它们保存在登录时自动生成的文件中:
/home/anmol/.env_vars
:
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-PwezoBTpF3
export DBUS_SESSION_BUS_ADDRESS
XAUTHORITY=/home/anmol/.Xauthority
export XAUTHORITY
DISPLAY=:0
export DISPLAY
并且,在 crontab 缓冲区中,我输入了以下内容:
PATH=/home/anmol/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
* * * * * /home/anmol/display-notif.sh
在哪里display-notif.sh
包含:
#!/usr/bin/env bash
. /home/anmol/.env_vars
notify-send 'hello'
虽然我可以通过此设置notify-send
从非 sudo cron ( crontab -e
) 运行,但我无法从 sudo cron ( ) 运行sudo crontab -e
。
我还尝试检查是否生成任何错误:
* * * * * /home/anmol/display-notif.sh 2>/home/anmol/log
但该日志文件是空的。
我如何通过 sudo cron 使其工作?
我使用的是 Ubuntu 16.04。
答案1
这个函数(来自https://unix.stackexchange.com/a/344377/7286)在 Ubuntu 16.04 中对我有用:
notify_all() {
local title=$1
local msg=$2
who | awk '{print $1, $NF}' | tr -d "()" |
while read u d; do
id=$(id -u $u)
. /run/user/$id/dbus-session
export DBUS_SESSION_BUS_ADDRESS
export DISPLAY=$d
su $u -c "/usr/bin/notify-send '$title' '$msg'"
done
}
答案2
更换后即可使用
* * * * * /home/anmol/display-notif.sh
和
* * * * * sudo -u anmol /home/anmol/display-notif.sh