Làm cách nào tôi có thể sử dụng cron để hiển thị tin nhắn trên màn hình thông qua gửi thông báo


7

Tôi đang đùa giỡn với notify-sendcron(trên máy Arch) và tôi không thể tìm ra cách kết hợp chúng:

Tôi đã thử giải pháp được đưa ra ở đâyở đây , nhưng không làm việc. Làm thế nào tôi có thể sử dụng chúng?

EDIT: Tôi đã đặt HIỂN THỊ trong crontab và nó vẫn không hoạt động. Tôi đã thử tương tự trong Ubuntu và mọi thứ đang hoạt động tốt. Đây là dòng cron của tôi:

*/1 * * * * DISPLAY=:0.0 /usr/bin/notify-send "hellp" || echo "er" > .er

1
Họ không làm việc theo cách nào? Bạn đã nhớ để thiết lập DISPLAY?
Michael Mrozek

Các thông báo lỗi là gì (chúng sẽ được gửi đến bạn qua email địa phương, đảm bảo bạn đã cài đặt MTA và kiểm tra /var/mail/yotamhoặc /var/spool/mail/yotam)? Bạn có thể cần phải đặt XAUTHORITYngoài DISPLAY, xem câu trả lời này .
Gilles 'SO- ngừng trở nên xấu xa'

Có một thông báo "Xác thực thất bại" xuất hiện trong /var/log/cron? Nếu nó xuất hiện, hãy xem bạn có /etc/pam.d/crondtệp trên Ubuntu không. Nếu bạn có, ăn cắp nó, nếu không thấy công việc cron không chạy vì pam? chủ đề trong diễn đàn openSUSE.
manatwork

Câu trả lời:


3

Về điều duy nhất mà tôi có thể đề xuất là tạo một đường ống có tên và ghi cron vào đường ống và có một đoạn script nhỏ được bắt đầu bởi trình quản lý phiên đọc từ đường ống và gọi thông báo-gửi:

while read line < /tmp/.cron2notify.s  # pipe name in /tmp
do notify-send "Cron message" "$line"
done

Sau đó trong crontab, có chương trình viết vào /tmp/.cron2notify.s.

Chưa thử nghiệm điều này, nhưng sẽ cho bạn một điểm khởi đầu để làm việc.


1

Tôi nghĩ rằng điều đó notify-sendphụ thuộc vào D-Bushầu hết các hệ thống và phương pháp phổ biến nhất để liên hệ với dbus là thông qua $DBUS_SESSION_BUS_ADDRESSbiến. Tuy nhiên, mã hóa cứng này crontabcó lẽ không khả thi lắm vì địa chỉ xe buýt thay đổi mỗi khi bạn khởi động một phiên bản mới của dbus thường xảy ra bất cứ khi nào bạn đăng nhập hoặc khởi động lại. Giải pháp của Arcege nghe có vẻ như một cách giải quyết tốt.


1

Tôi thực sự khuyên bạn nên sử dụng một kịch bản bao bọc. Để mô phỏng cuộc gọi cron thông báo-gửi, tôi đã đưa vào hệ thống của riêng tôi với "ssh localhost". Gọi '/ usr / bin / notify-send "foo"' Không hoạt động và tôi không gặp may khi thêm HIỂN THỊ =: 0,0 vào đường dây. Đây là những gì đã làm việc:

DBUS_SESSION_BUS_ADDRESS="$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/`pgrep -u username cinnamon|head -1`/environ | sed 's/DBUS_SESSION_BUS_ADDRESS=//')" /usr/bin/notify-send "foo"

Đó là RẤT lộn xộn, để nói rằng ít nhất. Cái này sạch hơn.

#! /bin/bash

DBUS=$(pgrep -ou $1 cinnamon)
DBUS="$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$DBUS/environ | sed 's/DBUS_SESSION_BUS_ADDRESS=//')"

DBUS_SESSION_BUS_ADDRESS="$DBUS" /usr/bin/notify-send $2

Và trong cron:

*/1 * * * * /path/to/notify.sh user "help"

Xin lưu ý rằng bit "quế" ở đó vì trình quản lý cửa sổ tôi sử dụng. Bạn có thể sẽ phải thay thế nó bằng nautilus, hoặc bất cứ điều gì khác mà bạn có với tư cách là người quản lý cửa sổ. Tôi cũng có một người dùng được chỉ định làm đối số đầu tiên, bởi vì nó làm cho nó trở nên mô đun hơn sau này, nếu bạn muốn điều này hoạt động bất kể ai đã đăng nhập.


Làm việc hoàn hảo :) Cảm ơn bạn rất nhiều!
AkiRoss

0

Tôi đã cố gắng sử dụng câu trả lời của Arcege, nhưng không thể làm cho nó hoạt động: vòng lặp while kết thúc sau khi dòng đầu tiên được ghi vào đường ống có tên. Điều làm việc cho tôi là có một kịch bản tương tự với một vòng lặp vô hạn, trong đó tôi bẫy các tín hiệu được gửi từ cron và sau đó gọi thông báo-gửi. Sau đây là chương trình "thông báo chuyển tiếp":

#! /bin/bash
function coffee () {
   notify-send "foo" "bar"
}
function lunch () {
   notify-send "bar" "foo" 
}
while true; do
  sleep 10
  trap coffee SIGUSR1
  trap lunch SIGUSR2
done

và crontab của tôi trông giống như

55 09,13 * * * pkill -USR1 forward-notify
55 11 * * * pkill -USR2 forward-notify

0

Thay thế: Bạn có thể vật lộn với tất cả những gì các bạn đang làm hoặc chỉ sử dụng tùy chọn xmessage:

    MSSG="/tmp/mssg-file-${RANDOM}" 
    echo -e " MESSAGE \n ==========\n Done with task, YEY. " > ${MSSG}
    xmessage -center -file ${MSSG} -display :0.0 
    [[ -s ${MSSG} ]] && rm -f ${MSSG}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.