Как вызвать zenity из скрипта cron?

8

Пример скрипта error.sh:

#! /bin/bash

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

Мой incron-config:

~/Documents IN_MOVED_TO ~/scripts/error.sh

Если я запускаю error.shв терминале графический интерфейс пользователя, но не в вышеупомянутом сценарии incron.

Как я могу сделать zenity, чтобы открыть этот диалог, когда я перемещаю файл в папку «Документы»?

zetah
источник

Ответы:

19

Нашел ответ здесь . Добавить к ~/.bashrc:

xhost local:$USER > /dev/null

и затем используйте zenity в скрипте, вызванном cron, вот так:

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

добавление --display=:0.0это то, что важно

zetah
источник
--display =: 0.0 было важно. Но сейчас у меня такая же проблема для обслуживания. Ничего не показывает, если я поставлю скрипт как сервис!
Dr.jacky
4

Чтобы запустить команду с графическим интерфейсом на cron, вы должны указать cron, какой дисплей должна использовать программа. Для этого вы используете: экспорт DISPLAY =: 0

Для уведомления zenity каждые 30 минут отредактируйте с помощью crontab -eи установите задание, например:

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

Подробно как: ссылка

damodaranudas
источник
2

Есть и другое возможное решение, если вы хотите, чтобы оно работало независимо от имени пользователя, путем поиска активного пользователя дисплея X с помощью ConsoleKit (команда ck-list-sessions). Предполагая, что приведенный ниже скрипт запущен от имени пользователя 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-session и вывода имени пользователя и отображения активного пользователя (может также потребоваться, чтобы это было локальное соединение, если вы хотите исключить пользователей ssh ​​-X, если хотите).

(Я использую это в сценарии резервного копирования, который запускается при подключении USB-накопителя.)

unhammer
источник