Saya menggunakan Arch Linux dengan KDE / Awesome WM. Saya mencoba untuk mulai
notify-send
bekerja cron
.
Saya telah mencoba pengaturan DISPLAY
/ XAUTHORITY
variabel, dan berjalan notify-send
dengan "sudo -u", semuanya tanpa hasil.
Saya dapat memanggil notify-send secara interaktif dari sesi dan mendapatkan notifikasi.
FWIW, pekerjaan cron berjalan dengan baik yang saya verifikasi dengan menggemakan hal ke file sementara. Hanya "kirim-kirim" yang gagal berfungsi.
Kode:
[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 ~]$
Seperti yang Anda lihat gema sebelum & sesudah pemberitahuan-kirim bekerja.
Saya juga telah mencoba pengaturanDISPLAY=:0.0
UPDATE: Saya mencari sedikit lebih banyak dan menemukan bahwa DBUS_SESSION_BUS_ADDRESS perlu disetel. Dan setelah hardcoding ini menggunakan nilai yang saya dapatkan dari sesi interaktif saya, pesan "halo" kecil mulai muncul di layar setiap menit!
Tetapi hasil tangkapannya adalah variabel ini tidak permanen untuk setiap pos tersebut, jadi saya akan mencoba solusi pipa yang disarankan di sana.
[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
Karena cron
sepertinya tidak mendukung notify-send (setidaknya tidak secara langsung) apakah ada beberapa sistem notifikasi lain yang lebih cron
ramah yang dapat saya gunakan?
&>>/tmp/crontest
ke baris kirim pemberitahuan dan lihat apakahnotify-send
ada pesan kesalahan.Jawaban:
Anda perlu mengatur
DBUS_SESSION_BUS_ADDRESS
variabel. Secara default cron tidak memiliki akses ke variabel. Untuk mengatasinya, letakkan skrip berikut di suatu tempat dan panggil ketika pengguna masuk, misalnya menggunakan fungsi luar biasa dan yangrun_once
disebutkan di wiki. Metode apa pun akan dilakukan, karena tidak ada salahnya jika fungsi dipanggil lebih sering dari yang dibutuhkan.Ini membuat file yang berisi variabel lingkungan Dbus yang diperlukan. Kemudian dalam skrip bernama cron Anda mengimpor variabel dengan sumber skrip:
Ini jawaban yang menggunakan mekanisme yang sama.
sumber
Anda perlu mengatur variabel di crontab itu sendiri:
Tidak
sudo
diperlukan, setidaknya tidak pada sistem saya.sumber
Cara paling aman untuk mendapatkan variabel lingkungan terkait sesi X adalah dengan mendapatkannya dari lingkungan proses pengguna yang masuk ke X. Ini adalah adaptasi dari skrip yang saya gunakan untuk tujuan yang persis sama (meskipun DBUS_SESSION_BUS_ADDRESS tidak t tampaknya menjadi masalah bagi saya di Debian):
Ini mengirim pesan ke pengguna X pertama yang ditemukannya, meskipun Anda bisa menambahkan loop untuk mengirimkannya ke semua pengguna.
Memperbarui
Tampaknya pembaruan ke format utmp menyebabkan
who
untuk mencetak tampilan daripada tty di kolom kedua. Ini sebenarnya membuat segalanya lebih mudah, sebelumnya hanya mencetak tampilan di komentar di akhir dan saya memutuskan ini tidak aman untuk diandalkan untuk jawaban yang asli. Jika ini masalahnya, coba ini:sumber
who_line
perintah. Outputnya sepertime :0 2015-09-23 10:40 ? 17234
.One-liner ini bekerja untuk saya di Manjaro dengan Cronie:
Tanpa DBUS_blah_blah yang sangat jelek itu tidak akan berfungsi sama sekali. Saya juga menemukan
journalctl -xb -u cronie
bermanfaat. Saya belum terbiasa dengan Cronie, tetapi membuat "crontab"/etc/cron.d/mycronjobs
saya dan saya tidak yakin apakah nama file itu diperlukan, atau apakah hanya membaca semua yang ada di direktori cron.d.Saya menemukan solusinya di sini https://wiki.archlinux.org/index.php/Desktop_notifications
sumber
Saya menggunakan i3 di Ubuntu 18.04. Cara saya untuk menyelesaikan ini adalah:
* * * * * XDG_RUNTIME_DIR=/run/user/$(id -u) notify-send Hey "this is dog!"
sumber
Ini cukup untuk membuat pekerjaan kirim pemberitahuan untuk saya di cronjob di Ubuntu Trusty:
Ini hanya mengekspor
DISPLAY
untuk pengguna yang menjalankan cronjob. Ini berfungsi untuk saya tanpa pengaturanXAUTHORITY
atauDBUS_SESSION_BUS_ADDRESS
.sumber
Bagi mereka yang di Linux yang nyaman menginstal paket Python, saya baru saja merilis program notify-send-headless yang berfungsi baik untuk saya. Ini mencari
/proc
variabel nama pengguna dan lingkungan yang diperlukan dan kemudian berjalannotify-send
dengan variabel-variabel ini (akan digunakansudo
untuk beralih ke pengguna yang diperlukan jika perlu).sumber
Anda juga dapat membuat skrip:
Kemudian jalankan dengan
sudo
. Namun, karenacrontab -e
menjalankan semua perintah dengan pengguna yang membuatnya, berikut ini sudah cukup ketika dipanggil tanpasudo
:Setidaknya itu untuk saya. Itu semua tampaknya tergantung pada konfigurasi lingkungan.
sumber
Saya menggunakan skrip ini di cron untuk mengirim MPD yang sekarang diputar ke twitter setiap jam
skrip serupa menggunakan notify-send
Anda mungkin mengalami masalah karena KDE menggunakan notify-deamon IIRC miliknya sendiri.
sumber
Untuk apa nilainya ....
Saya harus menggunakan SEMUA hal berikut di Debian Jessie untuk membuatnya berfungsi ...
Meninggalkan salah satu dari ini menyebabkannya berhenti bekerja.
sumber
*-0
disession-bus
direktori Anda . Anda mungkin berartisource "$HOME"/.dbus/session-bus/*-0
.Menggunakan sudo:
Kiat:
Kita bisa mendapatkan pengguna x saat ini dengan perintah ini
Tambahan...
Senang mendengarnya :
Cron yang berjalan di bawah root tidak memiliki akses ke x sehingga semua perintah gui tidak akan ditampilkan, salah satu solusi sederhana adalah menambahkan root ke pengguna x yang diotorisasi untuk pengguna x saat ini dengan perintah ini
dari shell pengguna x
atau
sumber
Berikut ini skrip yang tidak terlalu rumit daripada yang disediakan Graeme. Naskahnya tidak berfungsi untuk saya,
$who_line
selalu kosong. Script saya tidak membuang banyak waktu untuk menemukan suatu proses. Sebagai gantinya, ia hanya mencoba semua dan memilih nilai berguna terakhir yang ditemukan. Saya menjalankan xubuntu 14.04 dan menjalankan beberapa wadah lxc yang mungkin membingungkan skrip semacam ini.sumber
DBUS_SESSION_BUS_ADDRESS
. Saya bisa mendapatkannya dari kulit saya, tetapi tidak dari proses Xorg.