Điểm:0

Gửi thông báo không hoạt động từ ROOT crontab

lá cờ pg

Tập lệnh này hoạt động tốt trong crontab của người dùng, nhưng tôi cần chạy từ ROOT crontab, nhưng không hoạt động:

#!/bin/sh 
# cron.sh
# Thông báo cho người dùng về ngày giờ
nguồn /home/user/.bashrc
pid=$(pgrep -u user openbox | head -n 1)
dbus=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$pid/environ | sed 's/DBUS_SESSION_BUS_ADDRESS=//' )
xuất DBUS_SESSION_BUS_ADDRESS=$dbus
xuất HOME=/nhà/người dùng
xuất HIỂN THỊ =: 0
/usr/bin/notify-send 'title' "$(/bin/date)"

Kịch bản đã được tìm thấy ở đây: tập lệnh crontab

Tập lệnh được đặt trên /home/user/cron.sh với tất cả các quyền (777). Crontab gốc của tôi là:

* * * * * /home/user/cron.sh

Nếu tôi sử dụng tập lệnh này trong crontab người dùng bình thường thì nó hoạt động và hiển thị văn bản bật lên, nhưng không phải từ crontab gốc. Nhật ký hệ thống (/var/log/syslog ) không hiển thị lỗi khi kích hoạt crontab.

Artur Meinild avatar
lá cờ vn
Vui lòng giải thích thêm một số điều: 1) Cái gì không hoạt động, tập lệnh hoàn toàn không chạy? 2) Vị trí và quyền của tệp script là gì. 3) Dòng crontab được sử dụng để chạy tập lệnh là gì. Nói chung, hãy cung cấp càng nhiều thông tin càng tốt, nếu không thì rất khó để giúp đỡ.
Artur Meinild avatar
lá cờ vn
Có thể nào khi chạy từ root, chính người dùng root nhận được thông báo chứ không phải người dùng khác của bạn? Bạn có thể thêm dòng này để xác minh rằng tập lệnh thực sự chạy: `touch /home/user/script-has-run`. Nếu tệp `/home/user/script-has-run` tồn tại, thì tập lệnh đã được thực thi.
lá cờ hr
AFAIK `source` là một bashism - trong POSIX/bin/sh, bạn nên sử dụng `. /home/user/.bashrc` nhưng thực sự bạn không nên tìm nguồn `.bashrc` vào trình bao `sh` - nếu bạn muốn các tính năng từ `.bashrc` của người dùng, hãy chuyển shebang sang `#!/bin/ bash`
Điểm:1
lá cờ vn

Tôi khá chắc chắn rằng gửi thông báo cần được chạy với tư cách là người dùng sẽ nhận được thông báo. Hãy thử thay thế dòng cuối cùng bằng dòng này:

su user -c '/usr/bin/notify-send "title" "$(/bin/date)"'

Các su người dùng -c lệnh chuyển người dùng sang người dùng-c chuyển lệnh sau tới trình bao.

Câu lệnh này sẽ chuyển sang đúng người dùng và chạy lệnh.

Nếu bạn muốn chạy toàn bộ tập lệnh với tư cách người dùng khác, hãy xem câu hỏi và trả lời này từ Stack Overflow.

lá cờ hr
Tôi không nghĩ `su` chuyển các đối số theo sau cho lệnh `-c`, đúng không? Có lẽ đó cần phải là `su user -c '/usr/bin/notify-send "title" "$(/bin/date)"'`. Bất kể, nếu bạn định chạy `notify-send` với tư cách là `user` thì chắc chắn sẽ hợp lý hơn khi chạy toàn bộ mọi thứ từ crontab của `user` ...
Artur Meinild avatar
lá cờ vn
Tôi tin là bạn đúng. Tuy nhiên, tôi cũng thực sự không thể tìm ra cách sử dụng của OP, nhưng đã cố gắng trợ giúp từ những gì tôi có thể tìm thấy ở nơi khác.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.