Cron ile bildir-gönder kullanma


32

Arch Linux ile KDE / Awesome WM kullanıyorum. notify-sendÇalışmaya çalışıyorum cron.

Ayar DISPLAY/ XAUTHORITYdeğişkenleri notify-senddenemeyi ve "sudo -u" ile çalışmayı sonuçsuz olarak denedim .

Notify-send'i etkileşimli olarak oturumdan arayabilir ve bildirim alabilirim.

FWIW, cron işi, geçici bir dosyaya eşyalar ekleyerek doğruladığım kadar iyi çalışıyor. İşe yaramaz sadece "bildir-gönder" dir.

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 ~]$ 

Görüldüğü gibi yankıdan önce ve sonra notify-gönder çalıştı.
Ayrıca ayar denedimDISPLAY=:0.0

GÜNCELLEME: Biraz daha araştırdım ve DBUS_SESSION_BUS_ADDRESS ayarlanması gerektiğini öğrendim . Ve interaktif oturumumdan aldığım değeri kullanarak bunu kodladıktan sonra, minik "merhaba" mesajı her dakika ekranda belirmeye başladı!

Ancak bu değişken bu yazıya göre kalıcı değildir, bu yüzden orada önerilen adlandırılmış yöneltme çözümünü deneyeceğim.

[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

Yana crondaha başka bildirim sistemi vardır bildirmek-send (en azından doğrudan değil) desteklemek için görünmüyor cronben kullanabileceği dostu?


Bu gördüğüm kadarıyla çalışmalı. Neden bir &>>/tmp/crontestbildirim gönderme hattına bir ekleme yapmıyorsunuz ve notify-sendherhangi bir hata mesajı verip vermediğinizi görün .
Graeme

Merakım dışında çözümümü denedin mi? Debian'ımda çok daha basit görünüyor ve mükemmel çalıştı. Sadece Debian'a özgü olup olmadığını bilmek istiyorum
terdon

@terdon Çözümünüzü denedim (sadece hızlı bir test) ve Debian sistemimde çalışıyor gibi görünüyor. Gerçekten daha basit olduğu için genellikle uygulanabilir olup olmadığını bilmek istiyorum.
Marco

@Marco LMDE'deyim (aslında Debian testi) ve Cinnamon'i DE olarak kullanıyorum. Bunların ötesinde işe yarayıp yaramadığını size söyleyemem.
terdon

@Marco & terdon: Ubuntu çocuklar bunu yapabiliyor: ubuntuforums.org/showthread.php?t=1727148
justsomeone

Yanıtlar:


29

DBUS_SESSION_BUS_ADDRESSDeğişkeni ayarlamanız gerekir . Varsayılan olarak cron değişkene erişemez. Bunu düzeltmek için, aşağıdaki betiği bir yere koyun ve kullanıcı oturum açtığında, örneğin awesome ve run_oncewiki'de belirtilen işlevi kullanarak arayın . Herhangi bir yöntem işe yarar, çünkü işlev gerekenden daha sık çağrılırsa zarar vermez.

#!/bin/sh

touch $HOME/.dbus/Xdbus
chmod 600 $HOME/.dbus/Xdbus
env | grep DBUS_SESSION_BUS_ADDRESS > $HOME/.dbus/Xdbus
echo 'export DBUS_SESSION_BUS_ADDRESS' >> $HOME/.dbus/Xdbus

exit 0

Bu, gerekli Dbus ortam değişkeni değişkenini içeren bir dosya oluşturur. Daha sonra cron tarafından çağrılan betiğin içinde, betiği çalıştırarak değişkeni içe aktarırsınız:

if [ -r "$HOME/.dbus/Xdbus" ]; then
  . "$HOME/.dbus/Xdbus"
fi

İşte aynı mekanizmayı kullanan bir cevap.


1
Neredeyse çözüme yakın olduğumu gördüğüme sevindim. Teşekkürler Marco, bu temiz!
justsomeone

Harika, cevabınızı tekrar kullandım ve buraya daha ayrıntılı talimatlar ekledim: askubuntu.com/a/537721/34298
rubo77

Bu bir güvenlik riski olmaz mıydı? security.stackexchange.com/questions/71019/…
rubo77

@Gilles Sohbette bahsettiğiniz
rubo77

Ben ubuntu 15.10 DBUS dahil değil diğer pek çok cevap denedim ve hiçbir şey çalışmadı. Bu basit ve kusursuz çalışıyor.
bastian

16

Değişkenleri crontab'ın içinde ayarlamanız gerekir:

DISPLAY=:0.0
XAUTHORITY=/home/matrix/.Xauthority

# m h  dom mon dow   command 
* * * * *  /usr/bin/notify-send "hello"

Gerek yok sudo, en azından sistemimde yok.


Zaman ayırdığınız için teşekkürler terdon. Bu basit bir çözüm gibi görünüyor. Maalesef, bu benim için işe yaramadı,
justsomeone

justsomeone ha, tamam o zaman masaüstü ortamına bağlı olabilir.
terdon

Bunun dağıtım ya da Masaüstü Ortamı ile ilgisi olduğunu düşünüyorum. Ubuntu kullanıcıları için ileriye dönük çözümler çevrimiçi forumlarda gördüklerimden daha iyi sonuç veriyor.
justsomeone

@justsomeone DE olarak Cinnamon kullanarak Debian'da (LMDE) bulunuyorum. X'in nasıl başlatıldığı veya DE tarafından kullanılan bildirim sistemi ile ilgisi olabilir.
terdon

Ubuntu 14.04 / 14.10'da çalıştığını onayladı. GNOME ve Birlik ile.
Jordon Bedwell

8

X oturumu ile ilgili çevresel değişkenleri elde etmenin en güvenli yolu, bunları X'te oturum açan kullanıcının bir işlem ortamından elde etmektir. İşte kullandığım betiğin aynen aynı amaç için uyarlanması (DBUS_SESSION_BUS_ADDRESS yapmaz ' Debian'da benim için bir sorun gibi görünmüyor):

X=Xorg                   # works for the given X command
copy_envs="DISPLAY XAUTHORITY DBUS_SESSION_BUS_ADDRESS"

tty=$(ps h -o tty -C $X | head -1)
[ -z "$tty" ] && exit 1

# calling who with LANG empty ensures a consistent date format
who_line=$(LANG= who -u | grep "^[^ ]\+[ ]\+$tty")

x_user=$(echo $who_line | cut -d ' ' -f 1)  # the user associated with the tty
pid=$(echo $who_line | cut -d ' ' -f 7)     # the user's logon process

for env_name in $copy_envs
do
  # if the variable is not set in the process environment, ensure it does not remain exported here
  unset "$env_name"

  # use the same line as is in the environ file to export the variable
  export "$(grep -az "^$env_name=" /proc/$pid/environ)" >/dev/null
done

sudo -u "$x_user" notify-send "hello"

Bu, tüm kullanıcılara göndermek için bir döngü ekleyebilmenize rağmen, bulduğu ilk X kullanıcısına mesaj gönderir.

Güncelleştirme

Utmp formatındaki güncellemelerin who, ikinci sütununda tty yerine bir ekran yazdırmasına neden olduğu anlaşılıyor . Bu aslında işleri kolaylaştırıyor, daha önce sadece yorumdaki ekranı bastırıyordu ve bunun orijinal cevaba dayanmanın güvenli olmadığına karar verdim. Bu durumda, şunu deneyin:

X=Xorg                   # works for the given X command
copy_envs="DISPLAY XAUTHORITY DBUS_SESSION_BUS_ADDRESS"

# calling who with LANG empty ensures a consistent date format
who_line=$(LANG= who -u | awk '$2 ~ ":[0-9]"')

x_user=$(echo $who_line | cut -d ' ' -f 1)  # the user associated with the tty
pid=$(echo $who_line | cut -d ' ' -f 7)     # the user's logon process

for env_name in $copy_envs
do
  # if the variable is not set in the process environment, ensure it does not remain exported here
  unset "$env_name"

  # use the same line as is in the environ file to export the variable
  export "$(grep -az "^$env_name=" /proc/$pid/environ)" >/dev/null
done

sudo -u "$x_user" notify-send "hello"

Bu benim için Trusty'de işe yaramıyor çünkü who_linekomutta basılmış bir yazı yok . Çıktı benziyor me :0 2015-09-23 10:40 ? 17234.
blujay

1
@blujay, güncellendi.
Graeme,

Teşekkürler, bu işe yarıyor. Ancak, ayrı bir cevapta yayınladığım gibi, daha basit bir çözüm var.
blujay

@blujay evet, bu taşınabilir bir cevaba girişimi oldu. Bunun gerçekten mümkün olduğundan emin değilim, ancak çoğu durumda hala çalışması gerekir.
Graeme,

2

Bu tek gömlek benim için Manjaro'da Cronie ile çalıştı:

# Note: "1000" would be your user id, the output of... "id -u <username>" 
10 * * * * pj DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus notify-send 'Hello world!' 'This is an example notification.'

Çok çirkin DBUS_blah_blah olmadan hiç çalışmıyor. Ben de journalctl -xb -u croniefaydalı buldum . Henüz Cronie'ye aşina değilim, fakat "crontab" ı olduğu gibi oluşturdum /etc/cron.d/mycronjobsve bu dosya adının gerekli olup olmadığından veya cron.d dizinindeki her şeyi okuduğundan emin değilim.

Çözümü burada buldum https://wiki.archlinux.org/index.php/Desktop_notifications


2

İ3'ü Ubuntu 18.04'da kullanıyorum. Bunu çözmenin yolu şudur:

* * * * * XDG_RUNTIME_DIR=/run/user/$(id -u) notify-send Hey "this is dog!"


1

Bu benim için Ubuntu Trusty'nin bir cronjob'ünde bildirim gönderme-gönderme çalışması için yeterlidir:

#!/bin/bash
export DISPLAY=$(who -u | awk  '/\s:[0-9]\s/ {print $2}')

Sadece DISPLAYcronjob olarak çalışan kullanıcı için verir. Ayar yapmadan benim için çalışıyor XAUTHORITYveya DBUS_SESSION_BUS_ADDRESS.


1
16.04 Ubuntu'da da çalışıyor. Aslında ben bir sistem gerçekleştiren farklı bir Perl betiği başlatan ((notify-send ...)) bir bash betiği olan system () bir Perl betiği başlatıyorum. Export komutunun bash betiğine eklenmesi, o betiğin ortamını değiştirdi, son Perl betiği daha sonra devraldı ve sistemde kullanılabilir hale getirildi ("notify-send ..."). Blujay bulmak iyi!
Tim

1

Linux'ta Python paketlerini kurmakta rahat olanlar için, benim için iyi çalışan bir bildir-gönder başsız programı yayınladım. /procGerekli kullanıcı adı ve ortam değişkenlerini arar ve daha sonra notify-sendbu değişkenlerle çalışır ( sudogerekirse, istenen kullanıcıya geçmek için kullanılır ).


1

Ayrıca bir komut dosyası yapabilirsiniz:

#!/usr/bin/env bash
runuser -l [yourusername] -c 'DISPLAY=:0 notify-send "hey there user"'

Ardından ile çalıştırın sudo. Bununla birlikte, crontab -etüm komutları onu yaratan kullanıcı ile çalıştığından, aşağıdakiler olmadan çağrılması yeterlidir sudo:

#!/usr/bin/env bash
DISPLAY=:0 notify-send "hey there user"

En azından benim için yapıyor. Her şey çevre yapılandırmasına bağlı görünüyor.


0

MPD'yi şimdi saat başı twitter ile oynayarak göndermek için bu cronu cronda kullanıyorum

#!/bin/bash
export DISPLAY=":0.0"
msg=$(mpc current -h 192.168.1.33)
twitter set "#MPD Server nowplaying $msg :  http://cirrus.turtil.net:9001"
#ttytter -status="#MPD Server nowplaying $msg. http://cirrus.turtil.net:9001"

exit 

notify-send kullanarak benzer komut dosyası

#!/bin/bash
export DISPLAY=":0.0"
notify-send -i ~/.icons/48arch.png 'OS- Archlinux x86_64 : DWM Window Manager' 'Installed on Sun Apr 21 2013 at 18:17:22' 
exit

KDE kendi notify-deamon IIRC’sini kullandığı için sorun yaşıyor olabilirsiniz.


0

Değeri için ....

Bunun işe yaraması için Debian Jessie’de yer alan TÜM ifadeleri kullanmak zorunda kaldım ...

export DISPLAY=:0.0
export HOME=/home/$user
source "$HOME/.dbus/session-bus/*-0"

Bunlardan herhangi birini bırakmak, çalışmamasına neden oldu.


Anlamıyla denilen hiçbir dosya olacak, çünkü burada yazıldığı gibi Yani son satırı bir şey yapmayacağım *-0senin içinde session-busdizine. Kastetmiş olabilirsin source "$HOME"/.dbus/session-bus/*-0.
roaima

0

Sudo kullanımı:

sudo -u $currentxuser notify-send $message

İpucu:

Mevcut x kullanıcısını bu komutla alabiliriz

ps auxw | grep -i screen | grep -v grep | cut -f 1 -d ' '

Ek olarak...

currentxuser=$(ps auxw | grep -i screen | grep -v grep | cut -f 1 -d ' ')
echo $currentxuser

Bilmek iyi:

Kök altında çalışan cron x'e erişemez, bu nedenle tüm gui komutları gösterilmez, basit bir çözüm bu komutla mevcut x kullanıcısı için yetkili x kullanıcısına root eklemektir.

x kullanıcı kabuğundan

xhost local:root

veya

sudo -u $currentxuser xhost local:root

-1

Graeme'nin sağladığından daha az karmaşık bir betik. Senaryosu benim için işe yaramadı $who_line, her zaman boştu. Senaryom bir süreç bulmakla çok zaman kaybetmiyor. Bunun yerine, sadece hepsini dener ve bulunan son faydalı değeri seçer. Xubuntu 14.04 kullanıyorum ve bu tür betikleri şaşırtan çalışan bazı LXC konteynerleri kullanıyorum.

env="$(
  ps -C init -o uid,pid | while read u p; do
    [ "$u" = "`id -u`" ] || continue
    grep -az '^DBUS_SESSION_BUS_ADDRESS=' /proc/$p/environ | xargs -0
  done | tail -1
)"

export "$env"

notify-send "test"

Bu benim için Trusty'de işe yaramıyor çünkü Xorg sürecinin ortamı yok DBUS_SESSION_BUS_ADDRESS . Mermilerimden alabilirim ama Xorg sürecinden değil.
blujay
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.