如何从 cron 脚本调用 zenity?

如何从 cron 脚本调用 zenity?

示例脚本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 驱动器时运行的脚本。

相关内容