¿Cómo llamar a zenity desde cron script?

8

Script de ejemplo error.sh:

#! /bin/bash

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

Mi incron-config:

~/Documents IN_MOVED_TO ~/scripts/error.sh

Si ejecuto el error.shterminal, aparece el cuadro de diálogo GUI, pero no en el escenario incron anterior.

¿Cómo puedo hacer que zenity muestre ese diálogo cuando muevo el archivo en la carpeta Documentos?

zetah
fuente

Respuestas:

19

Respuesta encontrada aquí . Añadir a ~/.bashrc:

xhost local:$USER > /dev/null

y luego usa zenity en el script evocado por cron así:

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

agregar --display=:0.0es lo importante

zetah
fuente
--display =: 0.0 fue importante. Pero ahora tengo el mismo problema para el servicio. ¡No muestra nada si pongo script como servicio!
Dr.jacky
4

Para ejecutar un comando GUI en cron, deberá decirle a cron qué pantalla debe usar el programa. Para eso usa: export DISPLAY =: 0

Para una notificación zenity cada 30 minutos, edite crontab -ey configure un trabajo como:

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

Detallado cómo: enlace

damodaranudas
fuente
2

Hay otra solución posible si desea que funcione independientemente del nombre de usuario, encontrando el usuario activo de la pantalla X, usando ConsoleKit (el comando ck-list-sessions). Suponiendo que la secuencia de comandos a continuación se ejecuta como root, mostrará un mensaje zenity al usuario activo actual en su computadora:

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

El pequeño script awk es solo para analizar ck-list-sessions y generar el nombre de usuario y la visualización del usuario que está activo (también podría requerir que sea una conexión local si desea excluir a los usuarios de ssh -X, si lo desea).

(Lo uso en un script de respaldo que se ejecuta al enchufar una unidad USB).

desarmar
fuente