Menggunakan baris perintah, saya ingin menampilkan pemberitahuan di setiap tampilan X yang sedang berjalan. (dan menjalankan konsol)
Sesuatu seperti:
notify-send-all 'Warning' 'Nuclear launch in 5 minutes, please evacuate'
Apakah ada program yang akan melakukan ini? Jika tidak, dapatkah ini diimplementasikan dengan bash?
command-line
xorg
tty
console
notifications
Stefan
sumber
sumber
Jawaban:
Anda dapat mengirim pesan ke semua konsol dengan dinding perintah.
Untuk mengirim notifikasi di bawah X ada notify-send yang mengirimkan notifikasi kepada pengguna saat ini pada tampilan saat ini. (Dari pertanyaan Anda, saya kira Anda sudah tahu yang ini.) Anda dapat membangun ini dengan beberapa skrip bash. Pada dasarnya Anda harus mencari tahu pengguna mana yang X-Display. Setelah Anda mendapatkan info ini, Anda dapat menggunakan notify-send seperti ini:
Di mana fschmitt adalah pengguna pada tampilan 0. Anda dapat mengurai output dari perintah "siapa" untuk menemukan semua pengguna dan tampilan mereka. Outputnya terlihat seperti ini
Anda tahu, ada dua pengguna yang menjalankan sesi X, markmerk3 pada tampilan 0 dan seamonkey pada tampilan 1. Saya pikir Anda perlu memahami untuk tty [0-9] * kemudian memastikan bahwa pada akhir baris ada (: [0 -9.] *) Untuk menyingkirkan login konsol dan mengekstrak id tampilan dari string di antara tanda kurung.
sumber
who
memberi tahu Anda siapa yang masuk dan di mana X menampilkan login itu. Anda mungkin harus sedikit memfilternya.who | awk '/\(:[0-9]+\)/ {gsub("[:|(|)]","");print "DISPLAY=:"$5 " sudo -u " $1 " notify-send \"Message\""}' | bash
. Juga, Anda mungkin ingin melihat unix.stackexchange.com/questions/1596/…Utas ini agak lama, maaf, tapi saya harap saya masih bisa menambahkan sesuatu yang berguna untuk topik ini. (juga Josef Kufner menulis naskah yang bagus, itu hanya sedikit terlalu lama untuk seleraku, dan itu menggunakan PHP)
Saya juga membutuhkan alat seperti yang dijelaskan dalam pertanyaan awal (untuk mengirim pesan ke semua pengguna X yang aktif). Dan berdasarkan jawaban di sini, saya menulis skrip bash-only kecil ini, yang mencari pengguna-X yang aktif (menggunakan 'siapa'), dan kemudian menjalankan notifikasi-kirim untuk setiap pengguna yang aktif.
Dan yang terbaik: Anda dapat menggunakan skrip saya persis seperti "beri tahu-kirim", dengan semua parameternya! ;-)
beri tahu-kirim-semua:
Salin kode di atas ke dalam file bernama "notify-send-all", buat itu dapat dieksekusi dan salin ke / usr / local / bin atau / usr / bin (sesuka Anda). Kemudian jalankan mis. Sebagai root di sesi konsol seperti ini:
notify-send-all -t 10000 "Warning" "The hovercraft is full of eels!"
Saya menggunakannya beberapa bulan sekarang, pada mesin yang berbeda, dan sejauh ini tidak ada masalah, dan saya sudah mengujinya dengan desktop MATE dan Cinnamon. Juga berhasil menjalankannya di dalam cron dan anacron.
Saya menulis skrip ini untuk / di bawah ArchLinux, jadi tolong beri tahu saya jika Anda mengalami masalah pada distribusi atau desktop Linux lain.
sumber
|egrep
?? Apakah egrep sebuah perintah?awk '{print $1$5}'
lebih baik digunakanawk '{print $1$NF}'
, sehingga tidak merusak beberapa lokal tempat tanggal diformat dengan spasi (misalnya,Jun 3
bukan2017-06-03
). Berikut ini juga versi untuk memberi tahu pengguna tertentu dan bukan semua pengguna: gist.github.com/shvchk/ba2f0da49bf2f571d6bf606d96f289d7grep -E
dan menambahkan/bin
ke path (lihat edit). Jangan ragu untuk kembali jika Anda keberatanSaya membutuhkan ini juga untuk beberapa notifikasi seluruh sistem. Ini solusinya. Ini memindai / proc untuk menemukan semua bus sesi dan kemudian mengeksekusi pemberitahuan-kirim pada masing-masing (sekali per bus). Semua argumen diteruskan tidak berubah ke notifikasi-kirim nyata
sumber
Di Ubuntu 16.04, saya ingin pemberitahuan dari skrip yang dijalankan sebagai root dari crontab. Setelah mengatur variabel lingkungan,
sudo -u $user
tidak berhasil karena suatu alasan, tetapish -c "..." $user
berhasil.Jadi saya sekarang menggunakan fungsi ini:
Cara menemukan variabel DBUS_SESSION_BUS_ADDRESS mungkin tergantung pada distribusi Anda. Di Ubuntu 16.04, ia berada di
/run/user/$UID/dbus-session
, yang hanya dapat bersumber.id -u
digunakan dalam fungsi di atas untuk mendapatkan UID dari nama pengguna yang dikembalikan olehwho
.sumber
Berikut ini adalah pembaruan skrip Andy: Cara itu menentukan
DBUS_SESSION_BUS_ADDRESS
tidak bekerja pada Centos 7. Jugawho
perintah tidak mencantumkan beberapa sesi untuk beberapa alasan, jadi saya parsingps aux
output sebagai gantinya. Skrip ini mengasumsikan pengguna login menggunakan X2GO (nxagent
), tetapi harus mudah disesuaikan untuk kasus lain.sumber
sumber