Como chamar zenity do script cron?

8

Script de exemplo error.sh:

#! /bin/bash

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

Meu incron-config:

~/Documents IN_MOVED_TO ~/scripts/error.sh

Se eu executar error.shna interface gráfica do terminal, aparece, mas não no cenário incron acima.

Como faço para o zenity exibir essa caixa de diálogo quando movo o arquivo na pasta Documentos?

zetah
fonte

Respostas:

19

Encontre a resposta aqui . Adicionar a ~/.bashrc:

xhost local:$USER > /dev/null

e use o zenity no script evocado pelo cron assim:

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

adicionando --display=:0.0é o que é importante

zetah
fonte
--display =: 0.0 foi importante. Mas agora eu tenho o mesmo problema para o serviço. Não mostra nada se eu colocar o script como serviço!
Dr.jacky
4

Para executar um comando da GUI no cron, você precisará informar ao cron qual exibição o programa deve usar. Para isso você usa: export DISPLAY =: 0

Para uma notificação do zenity a cada 30 minutos, edite crontab -ee defina um trabalho como:

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

Detalhado como: link

damodaranudas
fonte
2

Há outra solução possível, se você deseja que ele funcione independentemente do nome de usuário, encontrando o usuário ativo da tela X, usando o ConsoleKit (o comando ck-list-sessions). Supondo que o script abaixo seja executado como root, ele mostrará uma mensagem de zenity para o usuário ativo atual no seu computador:

#!/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!'"

O pequeno script awk é apenas para analisar ck-list-sessions e emitir o nome de usuário e a exibição do usuário que está ativo (também pode exigir que seja uma conexão local se você quiser excluir usuários do ssh -X, se desejar).

(Eu uso isso em um script de backup que é executado ao conectar uma unidade USB.)

desenfreado
fonte