示例脚本error.sh
:
#! /bin/bash
zenity --error --text='Something very bad has happened!'
我的incron-config
:
~/Documents IN_MOVED_TO ~/scripts/error.sh
如果我error.sh
在终端 GUI 对话框中运行,则会弹出,但在上面的 incron 场景中则不会。
当我在 Documents 文件夹中移动文件时,如何让 zenity 弹出该对话框?
答案1
找到答案这里。 添加~/.bashrc
:
xhost local:$USER > /dev/null
然后在 cron 调用的脚本中使用 zenity,如下所示:
zenity --error --text='Something very bad has happened!' --display=:0.0
添加--display=:0.0
才是最重要的
答案2
要在 cron 上运行 GUI 命令,您必须告诉 cron 程序应使用什么显示。为此,您可以使用:export DISPLAY=:0
对于每 30 分钟发送一次 zenity 通知,请编辑crontab -e
并设置如下作业:
*/30 * * * * export DISPLAY=:0 && /somedirectory/your_zenity_script.sh
详细说明如何:关联
答案3
如果您希望它无论用户名如何都能正常工作,还有另一种可能的解决方案,即使用 ConsoleKit(命令ck-list-sessions
)查找 X 显示器的活动用户。假设以下脚本以 root 身份运行,它将向您计算机上的当前活动用户显示 zenity 消息:
#!/bin/bash
ACTIVE=$(ck-list-sessions | awk -F' = ' '
function f(){if(A=="TRUE"){P=U"\t"D;gsub("'"'"'","",P);print P}}
$1=="\tunix-user"{U=$2}
$1=="\tx11-display"{D=$2}
$1=="\tactive"{A=$2}
END{f()} /^[^\t]/{f()}
')
USERID=${ACTIVE% *} # tab
USERNAME=$(getent passwd $USERID|cut -f1 -d':')
DISPLAY=${ACTIVE#* } # tab
DISPLAY="$DISPLAY" su $USERNAME -c "zenity --error --text='Something very bad has happened!'"
这个小 awk 脚本仅用于解析 ck-list-sessions 并输出活动用户的用户名和显示(如果您想排除 ssh -X 用户,也可能要求它是本地连接)。
(我用这个备份插入 USB 驱动器时运行的脚本。