Saya membuat naskah yang harus memberi tahu saya ketika ada bab manga baru yang saya baca. Saya menggunakan perintah notify-send untuk melakukan ini. Program ini berfungsi ketika saya mencoba menjalankannya di terminal. Pemberitahuan ditampilkan. Namun, ketika saya meletakkan ini di crontab saya, notifikasi tidak muncul. Saya cukup yakin bahwa program ini berjalan sejak saya membuatnya untuk membuat file untuk saya. File itu dibuat, tetapi notifikasi tidak muncul.
Ini skrip saya
#!/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
Dan inilah yang saya tulis di crontab saya
0,15,30,45 12-23 * * 3 /home/jchester/bin/opreminder.sh
cron
notify-send
pengguna158335
sumber
sumber
export DISPLAY=:0
.16.04
, yang ini bekerja untuk saya*/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"
Jawaban:
Perintah perlu merujuk lokasi mereka. Jadi
notify-send
perlu begitu/usr/bin/notify-send
Semua perintah harus memiliki path lengkapnya.
Gunakan
whereis notify-send
perintah untuk melihat di mana perintah Anda "hidup"sumber
notify-send
ada diPATH
bahkan untuk pekerjaan cron. Lihat jawaban saya di bawah ini.Sepertinya ada yang berbeda pada 13,04, setidaknya di Gnome Shell.
Pertama, inilah yang
env
dicetak saat dijalankan darizzyxy
tugas cron pengguna (bukan root):Untuk mulai
notify-send
bekerja, tampaknya perlu untuk mengaturDBUS_SESSION_BUS_ADDRESS
variabel lingkungan, sesuai komentar DahitiF di ubuntuforums.org. Hanya tambahkan yang berikut ini ke deskripsi pekerjaan Anda yang sebenarnya:Tampaknya tidak perlu diatur
DISPLAY
.sumber
gnome-session
kexfce4-session
.gnome-session
dan menggunakangnome-shell
sebagai gantinya (hati-hati juga adagnome-shell-calendar-server
sehinggapgrep
akan mendapat 2 pids). Saya juga diperlukanDISPLAY=:0
karena saya menggunakan 2 layar fisik dan tidak ditentukan. Terima kasih!openbox
untukgnome-session
.Perintah
notify-send
tidak akan menampilkan pesan di layar Anda ketika dimulai dengan cron. Cukup tambahkan tampilan target di bagian atas skrip Anda, misalnya:sumber
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
di terminal untuk memastikan tampilan Anda benar-benar:0
(biasanya, tetapi tidak selalu).Setidaknya untuk Ubuntu 14.04, respons klrmr di atas adalah jawaban yang benar. Tampaknya tidak perlu mengatur DISPLAY atau mengartikulasikan jalur lengkap untuk memberi tahu-kirim atau apa pun yang biasanya dalam $ PATH.
Di bawah ini adalah skrip cron yang saya gunakan untuk mematikan mesin virtual ketika kondisi baterai laptop menjadi terlalu rendah. Pengaturan baris DBUS_SESSION_BUS_ADDRESS dalam respons klrmr di atas adalah modifikasi yang akhirnya membuat peringatan bekerja dengan benar.
sumber
Dalam kasus saya dengan ubuntu 16.04, setiap jalur eksplisit diperlukan, saya menyelesaikan masalah hanya dengan menambahkan
pada baris pertama crontab, sebelum panggilan beri tahu-kirim.
sumber
Penyebab pertama adalah file crontab Anda, Anda juga harus menyebutkan nama pengguna yang dengannya skrip harus dieksekusi, lebih baik simpan sebagai root
dan kemudian Anda harus menggunakan nama_pengguna GUI di dalam skrip dan menambahkannya untuk memberi tahu-kirim dengan "sudo atau su" untuk menjalankan perintah sebagai pengguna yang memiliki GUI
contoh:
atau
di mana
gnome_user_name
nama pengguna dari pengguna yang memulai sesi GUI itu adalah Anda yang masuk, dan jika Anda ingin menjadikannya pilihan yang dinamis, Anda bisa mendapatkannya daricontoh:
atau
sumber
oniltonmaciel
, tetapi$GNOME_USER
akan menunjukkanonilton+
(tidak berfungsi)Cara biner mengambil alamat dbus tampaknya telah berubah belakangan ini. Pada Ubuntu 15.04 (Vivid Vervet) dengan "notify-send 0.7.6", diperlukan dua variabel berikut:
Pernyataan oleh 'krlmlr' mengevaluasi dengan baik dan menetapkan alamat yang benar, tetapi dialog tidak akan muncul dari tugas cron.
sumber
Jika skrip Anda di crontab berjalan sebagai root, jawaban di atas mungkin tidak akan berfungsi. Coba fungsi ini, yang berfungsi baik untuk saya di 16.04:
(Sumber: https://unix.stackexchange.com/a/344377/7286 )
sumber
Lebih baik mengandalkan
dbus-session
proses, itu harus berjalan untuk semua sistem di manaDBUS_SESSION_BUS_ADDRESS
ada.Buat skrip:
Jadikan itu dapat dieksekusi:
Tambahkan ke crontab:
sumber
Ini membutuhkan waktu lama untuk membuat pekerjaan di ubuntu 15.10, Harus menambahkan sumber untuk mendapatkan pengguna yang normal. tampilan saya adalah: 1 karena beberapa alasan juga. Menggunakan pid sesi pertama gnome-hasil untuk pencarian DBUS_SESSION_BUS_ADDRESS.
sumber
Saya baru saja menggunakan ini untuk bekerja dengan desktop kayu manis di Ubuntu 15.10, menggunakan resep berikut:
Kuncinya adalah menyadari bahwa 'sesi kayu manis' terlalu lama untuk ditemukan oleh pgrep:
Saya juga harus menggunakan \ grep karena grep saya alias
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
Masalah yang disebabkan oleh panggilan
python3
di crontab denganUTF-8
lokal.TL; DR: panggilan awalan di crontab dg lokal seperti pada:
Lihat juga klik dan python3 :
sumber
Untuk semua skrip crontab yang menggunakan libnotify, saya menggunakan ini:
Ia bekerja bahkan jika saya menggunakan cron dalam mode root.
sumber
Yang Anda butuhkan adalah X_user dan X_userid. Ganti keduanya dalam perintah di bawah ini.
Solusi dengan systemd
/etc/systemd/system/opreminder.service #Service file
/etc/systemd/system/opreminder.timer file #timer
/home/jchester/bin/opreminder.sh # Script
Tidak perlu menggunakan sudo -u jika file layanan sudah disetel dengan pengguna yang dituju
Sumber: https://wiki.archlinux.org/index.php/Desktop_notifications#Usage_in_programming
sumber