Estou usando o Arch Linux com o KDE / Awesome WM. Eu estou tentando
notify-send
trabalhar cron
.
Eu tentei definir DISPLAY
/ XAUTHORITY
variáveis e executando notify-send
com "sudo -u", tudo sem resultado.
Consigo ligar para notificar-enviar interativamente a partir da sessão e receber notificações.
FWIW, o trabalho cron está sendo executado corretamente, o que eu verifiquei ecoando coisas para um arquivo temporário. É apenas o "envio de notificação" que não funciona.
Código:
[matrix@morpheus ~]$ crontab -l
* * * * * /home/matrix/scripts/notify.sh
[matrix@morpheus ~]$ cat /home/matrix/scripts/notify.sh
#!/bin/bash
export DISPLAY=127.0.0.1:0.0
export XAUTHORITY=/home/matrix/.Xauthority
echo "testing cron" >/tmp/crontest
sudo -u matrix /usr/bin/notify-send "hello"
echo "now tested notify-send" >>/tmp/crontest
[matrix@morpheus ~]$ cat /tmp/crontest
testing cron
now tested notify-send
[matrix@morpheus ~]$
Como você pode ver, o eco antes e depois do envio de notificação funcionou.
Também tentei configurarDISPLAY=:0.0
ATUALIZAÇÃO: pesquisei um pouco mais e descobri que DBUS_SESSION_BUS_ADDRESS precisa ser definido. E depois de codificar isso usando o valor que recebi da minha sessão interativa, a pequena mensagem de "olá" começou a aparecer na tela a cada minuto!
Mas o problema é que essa variável não é permanente por esse post, então tentarei a solução de pipe nomeada sugerida lá.
[matrix@morpheus ~]$ cat scripts/notify.sh
#!/bin/bash
export DISPLAY=127.0.0.1:0.0
export XAUTHORITY=/home/matrix/.Xauthority
export DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-BouFPQKgqg,guid=64b483d7678f2196e780849752e67d3c
echo "testing cron" >/tmp/crontest
/usr/bin/notify-send "hello"
echo "now tested notify-send" >>/tmp/crontest
Como cron
não parece oferecer suporte ao envio de notificação (pelo menos não diretamente), existe algum outro sistema de notificação mais cron
amigável que eu possa usar?
&>>/tmp/crontest
à linha de notificação de envio e vê se hánotify-send
alguma mensagem de erro.Respostas:
Você precisa definir a
DBUS_SESSION_BUS_ADDRESS
variável. Por padrão, o cron não tem acesso à variável. Para remediar isso, coloque o seguinte script em algum lugar e chame-o quando o usuário efetuar login, por exemplo, usando awesome e arun_once
função mencionada no wiki. Qualquer método serve, pois não prejudica se a função for chamada com mais frequência do que o necessário.Isso cria um arquivo contendo a variável de ambiente Dbus necessária. Em seguida, no script chamado pelo cron, você importa a variável, fornecendo o script:
Aqui está uma resposta que usa o mesmo mecanismo.
fonte
Você precisa definir as variáveis no próprio crontab:
Não é
sudo
necessário, pelo menos não no meu sistema.fonte
A maneira mais segura de obter variáveis ambientais relacionadas à sessão X é obtê-las do ambiente de um processo do usuário conectado ao X. Aqui está uma adaptação do script que eu uso exatamente para o mesmo objetivo (embora DBUS_SESSION_BUS_ADDRESS não tenha ' parece ser um problema para mim no Debian):
Isso envia uma mensagem para o primeiro usuário X encontrado, embora você possa adicionar um loop para enviá-lo a todos os usuários.
Atualizar
Parece que as atualizações no formato utmp causam
who
a impressão de uma exibição em vez de um tty em sua segunda coluna. Isso na verdade facilita as coisas, antes ele apenas imprimia a exibição no comentário no final e eu decidi que não era seguro confiar na resposta original. Se for esse o caso, tente o seguinte:fonte
who_line
comando. A saída pareceme :0 2015-09-23 10:40 ? 17234
.Essa frase só funcionou para mim em Manjaro com Cronie:
Sem o muito feio DBUS_blah_blah, ele não funciona. Eu também achei
journalctl -xb -u cronie
útil. Ainda não estou familiarizado com o Cronie, mas criei o meu "crontab"/etc/cron.d/mycronjobs
e não tenho certeza se esse nome de arquivo é necessário ou se apenas lê tudo no diretório cron.d.Encontrei a solução aqui https://wiki.archlinux.org/index.php/Desktop_notifications
fonte
Eu uso o i3 no Ubuntu 18.04. Minha maneira de resolver isso é:
* * * * * XDG_RUNTIME_DIR=/run/user/$(id -u) notify-send Hey "this is dog!"
fonte
Isso é suficiente para fazer com que o envio de notificação funcione para mim em um cronjob no Ubuntu Trusty:
Ele simplesmente exporta
DISPLAY
para o usuário em que o cronjob está sendo executado. Funciona para mim sem definirXAUTHORITY
ouDBUS_SESSION_BUS_ADDRESS
.fonte
Para quem está confortável com a instalação de pacotes Python no Linux, acabei de lançar um programa de notificação-envio-sem-cabeça que está funcionando bem para mim. Ele procura
/proc
o nome de usuário necessário e as variáveis de ambiente e, em seguida, executanotify-send
com essas variáveis (será usadosudo
para alternar para o usuário necessário, se necessário).fonte
Você também pode criar um script:
Em seguida, execute-o com
sudo
. No entanto, comocrontab -e
executa todos os comandos com o usuário que o criou, o seguinte deve ser suficiente quando chamado semsudo
:Pelo menos faz para mim. Tudo parece depender da configuração do ambiente.
fonte
Eu uso esse script no cron para postar MPD agora tocando no twitter a cada hora
script semelhante usando o envio de notificação
você pode estar tendo problemas, já que o KDE usa seu próprio notify-deamon IIRC.
fonte
Por que vale a pena ....
Eu tive que usar TODOS os itens a seguir no Debian Jessie para fazer isso funcionar ...
Deixar de fora qualquer um deles fez com que parasse de funcionar.
fonte
*-0
em seusession-bus
diretório. Você pode ter pensadosource "$HOME"/.dbus/session-bus/*-0
.Usando o sudo:
Gorjeta :
Podemos obter o usuário x atual por este comando
Além do que, além do mais...
Bom saber :
Cron executando sob root não tem acesso a x, portanto, todos os comandos gui não serão exibidos; uma solução simples é adicionar root ao usuário x autorizado para o usuário x atual com este comando
do shell do usuário x
ou
fonte
Aqui está um script menos complexo do que o Graeme forneceu. Seu roteiro não funcionou para mim,
$who_line
estava sempre vazio. Meu script não perde muito tempo para encontrar um processo. Em vez disso, apenas tenta tudo e escolhe o último valor útil encontrado. Estou executando o xubuntu 14.04 e tenho alguns contêineres lxc em execução que provavelmente confundem esse tipo de script.fonte
DBUS_SESSION_BUS_ADDRESS
. Consigo obtê-lo das minhas conchas, mas não do processo Xorg.