Como posso usar o cron para exibir mensagens na tela via notificar-enviar

7

Estou brincando com notify-send e cron (em uma máquina Arch) e não consigo descobrir uma maneira de combiná-los:

Eu tentei a solução dada aqui e aqui , mas não funcionou. Como posso usá-los?

EDITAR: Eu configurei o DISPLAY no crontab e ele ainda não funcionou. Eu tentei o mesmo no Ubuntu e lá as coisas estão funcionando bem. Aqui está minha linha cron:

*/1 * * * * DISPLAY=:0.0 /usr/bin/notify-send "hellp" || echo "er" > .er
    
por Yotam 08.09.2011 / 22:38

5 respostas

3

A única coisa que posso sugerir é criar um pipe nomeado e fazer com que o cron grave no pipe e ter um pequeno script iniciado pelo gerenciador de sessões que lê o pipe e chama notify-send:

while read line < /tmp/.cron2notify.s  # pipe name in /tmp
do notify-send "Cron message" "$line"
done

Em seguida, no crontab, peça para o programa escrever em /tmp/.cron2notify.s .

Ainda não testou isso, mas deve lhe dar um ponto de partida para trabalhar.

    
por 08.09.2011 / 22:57
1

Eu acho que notify-send confia no D-Bus na maioria dos sistemas, e o método mais comum de contatar dbus é através da variável $DBUS_SESSION_BUS_ADDRESS . No entanto, codificar isso em crontab provavelmente não é muito viável, já que o endereço do barramento muda toda vez que você inicia uma nova instância do dbus, o que geralmente acontece sempre que você efetua login ou reinicializa. solução parece uma boa solução alternativa.

    
por 12.09.2011 / 00:35
1

Eu realmente recomendo usar um script de wrapper. Para emular cron chamando notificar-enviar, eu sshed em meu próprio sistema com "ssh localhost". Chamando '/ usr / bin / notify-send' foo '' Não funcionou, e não tive sorte ao adicionar DISPLAY =: 0.0 na linha. Aqui está o que funcionou:

DBUS_SESSION_BUS_ADDRESS="$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/'pgrep -u username cinnamon|head -1'/environ | sed 's/DBUS_SESSION_BUS_ADDRESS=//')" /usr/bin/notify-send "foo"

Isso é MUITO confuso, para dizer o mínimo. Isso é mais limpo.

#! /bin/bash

DBUS=$(pgrep -ou $1 cinnamon)
DBUS="$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$DBUS/environ | sed 's/DBUS_SESSION_BUS_ADDRESS=//')"

DBUS_SESSION_BUS_ADDRESS="$DBUS" /usr/bin/notify-send $2

E no cron:

*/1 * * * * /path/to/notify.sh user "help"

Por favor, note que o bit "canela" está lá porque o gerenciador de janelas que eu uso. Você provavelmente terá que substituí-lo com nautilus, ou qualquer outra coisa que você tenha como gerenciador de janelas. Eu também tenho um usuário especificado como o primeiro argumento, porque o torna mais modular depois, se você quer que isso funcione, independentemente de quem está logado.

    
por 06.06.2014 / 01:54
0

Eu tentei usar a resposta do Arcege, mas não consegui fazê-lo funcionar: o loop while termina depois que a primeira linha é gravada no pipe nomeado. O que funcionou para mim foi ter um script semelhante com um loop infinito, no qual eu interceptar sinais enviados pelo cron e depois chamar notificar-enviar. O seguinte é o programa "notificar-forward":

#! /bin/bash
function coffee () {
   notify-send "foo" "bar"
}
function lunch () {
   notify-send "bar" "foo" 
}
while true; do
  sleep 10
  trap coffee SIGUSR1
  trap lunch SIGUSR2
done

e meu crontab parece

55 09,13 * * * pkill -USR1 forward-notify
55 11 * * * pkill -USR2 forward-notify
    
por 14.06.2013 / 15:04
0

Alternativa: Você poderia lutar com tudo o que vocês estão fazendo ou apenas usar a opção xmessage:

    MSSG="/tmp/mssg-file-${RANDOM}" 
    echo -e " MESSAGE \n ==========\n Done with task, YEY. " > ${MSSG}
    xmessage -center -file ${MSSG} -display :0.0 
    [[ -s ${MSSG} ]] && rm -f ${MSSG}
    
por 05.06.2014 / 23:40