Używam Arch Linux z KDE / Awesome WM. Próbuję zabrać się
notify-send
do pracy cron
.
Próbowałem ustawienia DISPLAY
/ XAUTHORITY
zmienne i działa notify-send
z "sudo -u", wszystko bez rezultatu.
Jestem w stanie dzwonić interaktywnie z sesji i otrzymywać powiadomienia.
FWIW, zadanie crona działa poprawnie, co zweryfikowałem przez echo rzeczy do pliku tymczasowego. To tylko „powiadomienie-wysłanie” nie działa.
Kod:
[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 ~]$
Jak widać echo przed i po powiadomieniu-send działało.
Również próbowałem ustawieniaDISPLAY=:0.0
AKTUALIZACJA: Szukałem trochę więcej i stwierdziłem, że DBUS_SESSION_BUS_ADDRESS musi zostać ustawiony. Po zakodowaniu tego na podstawie wartości uzyskanej z mojej interaktywnej sesji, maleńka mała wiadomość „cześć” zaczęła pojawiać się na ekranie co minutę!
Ale catch polega na tym, że ta zmienna nie jest stała dla tego postu, więc wypróbuję nazwane rozwiązanie potoku sugerowane tam.
[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
Ponieważ cron
wydaje się, że nie obsługuje wysyłania powiadomień (przynajmniej nie bezpośrednio), czy istnieje jakiś inny system powiadomień, który jest bardziej cron
przyjazny, z którego mogę korzystać?
&>>/tmp/crontest
do linii wysyłania powiadomień i nie zobaczysznotify-send
żadnych komunikatów o błędach.Odpowiedzi:
Musisz ustawić
DBUS_SESSION_BUS_ADDRESS
zmienną. Domyślnie cron nie ma dostępu do zmiennej. Aby temu zaradzić, umieść gdzieś poniższy skrypt i wywołaj go, gdy użytkownik się zaloguje, na przykład używając niesamowite irun_once
funkcji wspomnianej na wiki. Każda metoda zadziała, ponieważ nie zaszkodzi, jeśli funkcja jest wywoływana częściej niż jest to wymagane.Spowoduje to utworzenie pliku zawierającego wymaganą zmienną środowiska Dbus. Następnie w skrypcie wywoływanym przez crona importujesz zmienną, pobierając skrypt:
Oto odpowiedź, która wykorzystuje ten sam mechanizm.
źródło
Musisz ustawić zmienne w samym crontabie:
Nie
sudo
potrzebne, przynajmniej nie w moim systemie.źródło
Najbezpieczniejszym sposobem na uzyskanie zmiennych środowiskowych związanych z sesją X jest pobranie ich ze środowiska procesu użytkownika zalogowanego do X. Oto adaptacja skryptu, którego używam do tego samego celu (chociaż DBUS_SESSION_BUS_ADDRESS nie robi wydaje mi się to problemem dla Debiana):
To wysyła wiadomość do pierwszego znalezionego użytkownika X, chociaż można dodać pętlę, aby wysłać go do wszystkich użytkowników.
Aktualizacja
Wygląda na to, że aktualizacje formatu utmp powodują
who
wydrukowanie wyświetlacza zamiast tty w drugiej kolumnie. To faktycznie sprawia, że jest łatwiej, wcześniej drukował tylko wyświetlacz w komentarzu na końcu i zdecydowałem, że nie jest bezpiecznie polegać na oryginalnej odpowiedzi. Jeśli tak jest, spróbuj tego:źródło
who_line
. Wyjście wygląda jakme :0 2015-09-23 10:40 ? 17234
.Ten liner działał dla mnie w Manjaro z Cronie:
Bez bardzo brzydkiego DBUS_blah_blah w ogóle nie działa. Uznałem również za
journalctl -xb -u cronie
pomocny. Nie znam jeszcze Cronie, ale utworzyłem „crontab” jako/etc/cron.d/mycronjobs
i nie jestem pewien, czy ta nazwa pliku jest wymagana, czy tylko czyta wszystko w katalogu cron.d.Znalazłem rozwiązanie tutaj https://wiki.archlinux.org/index.php/Desktop_notifications
ź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
Jest to wystarczające, aby powiadomienie-wysyłanie działało dla mnie w cronjob na Ubuntu Trusty:
Po prostu eksportuje
DISPLAY
użytkownika, dla którego działa cronjob. Działa dla mnie bez ustawianiaXAUTHORITY
lubDBUS_SESSION_BUS_ADDRESS
.źródło
Dla tych z Linuksa, którzy lubią instalować pakiety Pythona, właśnie wydałem program bezgłowy typu „wyślij-wyślij ”, który działa dla mnie dobrze. Wyszukuje
/proc
wymaganą nazwę użytkownika i zmienne środowiskowe, a następnie uruchamia sięnotify-send
z tymi zmiennymi (wsudo
razie potrzeby przełączy się na wymaganego użytkownika).źródło
Możesz także zrobić skrypt:
Następnie uruchom go
sudo
. Ponieważ jednakcrontab -e
wszystkie komendy są uruchamiane przez użytkownika, który go utworzył, wystarczy, że wywołane bezsudo
:Przynajmniej tak dla mnie. Wszystko wydaje się zależeć od konfiguracji środowiska.
źródło
Używam tego skryptu w cronie, aby publikować MPD teraz grającego na Twitterze co godzinę
podobny skrypt wykorzystujący powiadomienie-wysyłanie
możesz mieć problemy, ponieważ KDE używa własnego IIRC powiadomień.
źródło
Tyle ile jest warte....
Musiałem użyć WSZYSTKICH następujących elementów na Debian Jessie, aby to zadziałało ...
Pozostawienie któregokolwiek z nich spowodowało, że przestał działać.
źródło
*-0
w twoimsession-bus
katalogu nie będzie żadnego pliku wywoływanego dosłownie . Mogłeś mieć na myślisource "$HOME"/.dbus/session-bus/*-0
.Korzystanie z sudo:
Wskazówka :
Możemy uzyskać bieżącego użytkownika x za pomocą tego polecenia
Dodatkowo...
Dobrze wiedzieć :
Cron działający pod rootem nie ma dostępu do x, więc wszystkie polecenia GUI nie będą wyświetlane, jednym prostym rozwiązaniem jest dodanie roota do uprawnionego x użytkownika dla bieżącego x użytkownika za pomocą tego polecenia
z powłoki użytkownika x
lub
źródło
Oto mniej skomplikowany skrypt niż ten, który zapewnił Graeme. Jego scenariusz nie działał dla mnie,
$who_line
zawsze był pusty. Mój skrypt nie marnuje dużo czasu na znalezienie procesu. Zamiast tego po prostu próbuje wszystkich i wybiera ostatnią znalezioną użyteczną wartość. Używam Xubuntu 14.04 i mam kilka kontenerów LXC, które prawdopodobnie mylą tego rodzaju skrypty.źródło
DBUS_SESSION_BUS_ADDRESS
. Mogę to pobrać z moich powłok, ale nie z procesu Xorga.