Eu criei um script que deveria me notificar quando houver um novo capítulo de mangá que estou lendo. Eu usei o comando notificar-enviar para fazer isso. O programa funciona quando estou tentando executá-lo no terminal. A notificação está sendo exibida. No entanto, quando coloquei isso no meu crontab, a notificação não aparece. Tenho certeza de que o programa está sendo executado desde que criei um arquivo para mim. O arquivo foi criado, mas a notificação não foi exibida.
Aqui está o meu script
#!/bin/bash
#One Piece Manga reminder
#I created a file named .newop that contains the latest chapter.
let new=$(cat ~/.newop)
wget --read-timeout=30 -t20 -O .opreminder.txt http://www.mangareader.net/103/one-piece.html
if (( $(cat .opreminder.txt | grep "One Piece $new" | wc -l) >=1 ))
then
(( new+=1 ))
echo $new
echo $new > ~/.newop
notify-send "A new chapter of One Piece was released."
else
notify-send "No new chapter for One Piece."
notify-send "The latest chapter is still $new."
fi
exit
E aqui está o que eu escrevi no meu crontab
0,15,30,45 12-23 * * 3 /home/jchester/bin/opreminder.sh
cron
notify-send
user158335
fonte
fonte
export DISPLAY=:0
.16.04
, este funcionou para mim*/1 * * * * eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gnome-session)/environ)";/usr/bin/notify-send -i appointment -c "im" "Keep Working"
Respostas:
Os comandos precisam fazer referência à sua localização. Então
notify-send
precisa ser/usr/bin/notify-send
Todos os comandos precisam ter seu caminho completo.
Use o
whereis notify-send
comando para ver onde seus comandos "vivem"fonte
notify-send
está noPATH
mesmo nível para um trabalho cron. Veja minha resposta abaixo.As coisas parecem diferentes no 13.04, pelo menos no Gnome Shell.
Primeiro, é isso que é
env
impresso quando executado a partirzzyxy
da tarefa cron do usuário (não da raiz):Para começar
notify-send
a trabalhar, parece ser necessário definir aDBUS_SESSION_BUS_ADDRESS
variável de ambiente, conforme comentário do DahitiF no ubuntuforums.org. Anexe apenas o seguinte à descrição do seu trabalho:Não parece ser necessário definir
DISPLAY
.fonte
gnome-session
paraxfce4-session
.gnome-session
e usei emgnome-shell
vez disso (tenha cuidado, há também umgnome-shell-calendar-server
modopgrep
que receberá 2 pids). Eu também precisavaDISPLAY=:0
porque eu estava usando duas telas físicas e não foi definido. Obrigado!openbox
porgnome-session
.O comando
notify-send
não mostraria a mensagem na tela quando iniciado pelo cron. Basta adicionar a exibição de destino na parte superior do seu script, por exemplo:fonte
gdk_mir_display_open Failed to connect to Mir: Failed to connect to server socket: No such file or directory Option parsing failed: Cannot open display:
echo $DISPLAY
em um terminal para garantir que seu monitor seja realmente:0
(normalmente é, mas nem sempre).Pelo menos para o Ubuntu 14.04, a resposta do klrmr acima é a resposta correta. Não parece ser necessário definir DISPLAY ou articular caminhos completos para envio de notificação ou qualquer outra coisa normalmente em $ PATH.
Abaixo está um script cron que estou usando para desligar uma máquina virtual quando o estado da bateria de um laptop fica muito baixo. A configuração da linha DBUS_SESSION_BUS_ADDRESS na resposta do klrmr acima é a modificação que finalmente conseguiu que os avisos funcionassem corretamente.
fonte
No meu caso com o ubuntu 16.04, qualquer caminho explícito era necessário, resolvo o problema apenas adicionando
nas primeiras linhas do crontab, antes de ligar para notificar-enviar.
fonte
O primeiro culpado é o seu arquivo crontab, você também precisa mencionar o nome de usuário com o qual o script deve ser executado, melhor mantê-lo como root
e, em seguida, você deve usar o nome de usuário do usuário da GUI dentro do script e anexá-lo previamente para notificar-enviar com "sudo ou su" para executar o comando como um usuário que possui a GUI
exemplo:
ou
onde
gnome_user_name
é o nome de usuário do usuário que iniciou a sessão da GUI, foi você quem efetuou login e, se quiser torná-la uma escolha dinâmica, pode obtê-lo emexemplo:
ou
fonte
oniltonmaciel
, mas$GNOME_USER
iria mostraronilton+
(não funciona)A maneira como o binário recupera o endereço dbus parece ter mudado ultimamente. No Ubuntu 15.04 (Vivid Vervet) com "notify-send 0.7.6", são necessárias as seguintes duas variáveis:
A instrução 'krlmlr' avalia bem e define o endereço correto, mas a caixa de diálogo não aparece em um trabalho cron.
fonte
Se o seu script no crontab estiver sendo executado como root, as respostas acima provavelmente não funcionarão. Tente esta função, que funciona bem para mim no 16.04:
(Fonte: https://unix.stackexchange.com/a/344377/7286 )
fonte
Melhor confiar no
dbus-session
processo, ele deve estar em execução em todos os sistemas ondeDBUS_SESSION_BUS_ADDRESS
está presente.Crie um script:
Torne executável:
Adicione-o ao crontab:
fonte
Demorou uma eternidade para fazer o trabalho no ubuntu 15.10. Tinha que adicionar uma fonte para obter os usuários normais. minha exibição foi: 1 por algum motivo também. Usando os primeiros resultados do gnome-session, pid para a pesquisa DBUS_SESSION_BUS_ADDRESS.
fonte
Acabei de fazer isso funcionar com a área de trabalho de canela no Ubuntu 15.10, usando a seguinte receita:
O truque era perceber que a "sessão de canela" é muito longa para o pgrep encontrar:
Eu também tive que usar \ grep porque meu grep é alias para
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
Problema causado pela chamada
python3
no crontab comUTF-8
localidade.TL; DR: chamada de prefixo no crontab com localidade como em:
Veja também click e python3 :
fonte
Para todos os scripts crontab que usam libnotify, eu uso este:
Funciona mesmo se eu usar o cron no modo raiz.
fonte
Tudo o que você precisa é do X_user e do X_userid. Substitua ambos no comando abaixo.
Solução com systemd
/etc/systemd/system/opreminder.service # Arquivo de serviço
Arquivo /etc/systemd/system/opreminder.timer #timer
/home/jchester/bin/opreminder.sh #O script
Não há necessidade de usar sudo -u se o arquivo de serviço já estiver definido com o usuário pretendido
Fonte: https://wiki.archlinux.org/index.php/Desktop_notifications#Usage_in_programming
fonte