Stworzyłem skrypt, który powinien powiadomić mnie, gdy czytam nowy rozdział mangi. W tym celu użyłem polecenia notify-send. Program działa, gdy próbuję uruchomić go w terminalu. Powiadomienie wyświetla się. Jednak gdy umieściłem to w moim crontabie, powiadomienie nie wyświetla się. Jestem pewien, że program działa, ponieważ stworzyłem dla niego plik. Plik został utworzony, ale powiadomienie nie zostało wyświetlone.
Oto mój skrypt
#!/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
A oto co napisałem w moim crontabie
0,15,30,45 12-23 * * 3 /home/jchester/bin/opreminder.sh
cron
notify-send
użytkownik158335
źródło
źródło
export DISPLAY=:0
. : .16.04
mnie ten zadziałał*/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"
Odpowiedzi:
Polecenia muszą odnosić się do ich lokalizacji. Tak
notify-send
musi być/usr/bin/notify-send
Wszystkie polecenia muszą mieć pełną ścieżkę.
Użyj
whereis notify-send
polecenia, aby zobaczyć, gdzie „żyją” Twoje poleceniaźródło
notify-send
jest naPATH
parze dla zadania cron. Zobacz moją odpowiedź poniżej.W 13.04 wydaje się inaczej, przynajmniej w Gnome Shell.
Po pierwsze, to jest
env
drukowane po uruchomieniu zzzyxy
zadania cron użytkownika (nie roota):Aby zabrać się
notify-send
do pracy, wydaje się konieczne ustawienieDBUS_SESSION_BUS_ADDRESS
zmiennej środowiskowej, zgodnie z komentarzem DahitiF na ubuntuforums.org. Po prostu wstaw następujące informacje do faktycznego opisu stanowiska:Ustawienie nie wydaje się konieczne
DISPLAY
.źródło
gnome-session
naxfce4-session
.gnome-session
i użyłemgnome-shell
zamiast tego (uważaj, jest teżgnome-shell-calendar-server
tak,pgrep
że dostaniesz 2 pids). Potrzebowałem również,DISPLAY=:0
ponieważ używam 2 ekranów fizycznych i nie zostało to zdefiniowane. Dzięki!openbox
nagnome-session
.Polecenie
notify-send
nie wyświetla komunikatu na ekranie po uruchomieniu przez crona. Wystarczy dodać wyświetlanie docelowe u góry skryptu, na przykład:źródło
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
w terminalu, aby upewnić się, że Twój wyświetlacz naprawdę jest:0
(zwykle jest, ale nie zawsze).Przynajmniej dla Ubuntu 14.04 powyższa odpowiedź klrmr jest poprawną odpowiedzią. Nie wydaje się konieczne ustawianie WYŚWIETLACZA lub określanie pełnych ścieżek dla powiadomienia-wysyłania lub czegokolwiek innego zwykle w $ PATH.
Poniżej znajduje się skrypt crona, którego używam do zamykania maszyny wirtualnej, gdy stan baterii laptopa staje się zbyt niski. Ustawienie linii DBUS_SESSION_BUS_ADDRESS w powyższej odpowiedzi klrmr to modyfikacja, która w końcu sprawiła, że ostrzeżenia działały poprawnie.
źródło
W moim przypadku z Ubuntu 16.04 wymagana była jakakolwiek wyraźna ścieżka, rozwiązuję problem po prostu dodając
na pierwszych liniach crontab, przed połączeniem powiadom-wyślij.
źródło
Pierwszym winowajcą jest twój plik crontab, musisz również wspomnieć o nazwie użytkownika, z którą skrypt ma zostać wykonany, lepiej zachowaj go jako root
a następnie powinieneś użyć nazwy użytkownika GUI w skrypcie i przygotować go do powiadomienia-send z „sudo lub su”, aby wykonać polecenie jako użytkownik będący właścicielem GUI
przykład:
lub
gdzie
gnome_user_name
jest nazwa użytkownika, który rozpoczął sesję GUI, to ty się zalogowałeś, a jeśli chcesz, aby była dynamiczna, możesz ją pobrać zprzykład:
lub
źródło
oniltonmaciel
, ale$GNOME_USER
pokaże sięonilton+
(nie działa)Wygląda na to, że sposób, w jaki binarny pobiera adres dbus, ostatnio się zmienił. W systemie Ubuntu 15.04 (Vivid Vervet) z opcją „powiadom-wyślij 0.7.6” potrzebne są następujące dwie zmienne:
Instrukcja „krlmlr” ocenia dobrze i ustawia poprawny adres, ale okno dialogowe nie wyskoczy z zadania cron.
źródło
Jeśli twój skrypt w crontabie działa jako root, powyższe odpowiedzi prawdopodobnie nie będą działać. Wypróbuj tę funkcję, która działa dobrze dla mnie w 16.04:
(Źródło: https://unix.stackexchange.com/a/344377/7286 )
źródło
Lepiej polegać na
dbus-session
procesie, powinien działać na wszystkich systemach, w którychDBUS_SESSION_BUS_ADDRESS
jest obecny.Utwórz skrypt:
Spraw, by był wykonywalny:
Dodaj to do crontab:
źródło
To trwało wieczność, aby pracować nad Ubuntu 15.10. Musiałem dodać źródło, aby uzyskać normalne zmienne env użytkowników. mój wyświetlacz był również: 1 z jakiegoś powodu. Korzystanie z pierwszych wyników sesji gnome dla wyszukiwania DBUS_SESSION_BUS_ADDRESS.
źródło
Właśnie dostałem to do pracy z cynamonowym pulpitem na Ubuntu 15.10, przy użyciu następującego przepisu:
Sztuką było uświadomienie sobie, że „sesja cynamonowa” jest zbyt długa, aby pgrep mógł znaleźć:
Musiałem także użyć \ grep, ponieważ mój grep jest aliasowany do
źródło
Używam i3 na Ubuntu 18.04. Mój sposób na rozwiązanie tego:
* * * * * XDG_RUNTIME_DIR=/run/user/$(id -u) notify-send Hey "this is dog!"
źródło
Problem spowodowany wywołaniem
python3
crontab zUTF-8
ustawieniami narodowymi.TL; DR: wywołanie prefiksu w crontab w / locale jak w:
Zobacz także kliknij i python3 :
źródło
Dla wszystkich skryptów crontab korzystających z libnotify używam tego:
Działa, nawet jeśli używam crona w trybie root.
źródło
Wszystko czego potrzebujesz to X_user i X_userid. Wymień oba w poni szym poleceniu.
Rozwiązanie z systemd
/etc/systemd/system/opreminder.service #Service file
/etc/systemd/system/opreminder.timer #timer
/home/jchester/bin/opreminder.sh # Skrypt
Nie trzeba używać sudo -u, jeśli plik usługi jest już ustawiony dla docelowego użytkownika
Źródło: https://wiki.archlinux.org/index.php/Desktop_notifications#Usage_in_programming
źródło