如何从cron脚本调用zenity?


8

示例脚本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方案中不会。

当我在“文档”文件夹中移动文件时,如何使弹出对话框的状态变好?

Answers:


19

在这里找到答案。添加到~/.bashrc

xhost local:$USER > /dev/null

然后在cron触发的脚本中使用zenity,如下所示:

zenity --error --text='Something very bad has happened!' --display=:0.0

--display=:0.0重要的是添加


--display =:0.0很重要。但是现在我在服务方面也遇到了同样的问题。如果我将脚本作为服务,它什么也不会显示!
Dr.jacky's

4

要在cron上运行GUI命令,您必须告诉cron该程序应使用什么显示。为此您使用:export DISPLAY =:0

对于每30分钟一次的提醒通知,请使用进行编辑,crontab -e然后设置一项工作,例如:

*/30 *  * * *  export DISPLAY=:0 && /somedirectory/your_zenity_script.sh

详细的方法:链接


2

如果您希望它不管用户名如何工作,还有另一种可能的解决方案,方法是使用ConsoleKit(命令ck-list-sessions)查找X显示器的活动用户。假设以下脚本以root身份运行,它将向您计算机上的当前活动用户显示一条消息:

#!/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驱动器时运行的备份脚本中。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.