Câu hỏi Tại sao đặt một script trong /etc/cron.hourly không hoạt động?


Tôi đặt một tập lệnh thực thi trong /etc/cron.hourly, nhưng kịch bản đó đã không chạy mỗi giờ thực sự nó không bao giờ chạy ở tất cả.

Đây là kịch bản (Âm thanh giờ) mà tôi đã thực hiện:

#! / bin / bash
mplayer ~ / Âm nhạc / sfx_msg-highlight.wv &> / dev / null &
spd-say -r -50 -p 50 -t male3 "Hiện tại là $ (ngày +"% l% p ")"
thông báo-gửi "It's:" "$ (ngày +"% l% p ") ngay bây giờ." -i ~ / Hình ảnh / "tee.png đầu tiên" -t 5000

Crontab của tôi là:

DISPLAY=":0.0"
XAUTHORITY="/home/naruto/.Xauthority"
XDG_RUNTIME_DIR="/run/user/1000"

0 * * * * /home/naruto/Hour-sound.sh

Trong khi mplayer và spd-say các lệnh được chạy chính xác, notify-send không phải là. Tôi cũng đã thử chuyển hướng lỗi tới một tệp:

0 * * * * /home/naruto/Hour-sound.sh 2>/tmp/error

Nhưng điều đó cho thấy không có đầu ra. Tôi đang làm gì sai?


12
2018-04-19 17:15


gốc


chỉ cần đảm bảo, bạn đã làm cho tập lệnh có thể thực thi được không? thuộc sở hữu của root? điều gì sẽ xảy ra khi bạn chạy tập lệnh từ thiết bị đầu cuối hoặc đặt một tập lệnh đơn giản ở đó? làm /etc/crontab có run-parts dòng để chạy hàng giờ cron công việc từ thư mục? - heemayl
Thực thi: có, chạy kịch bản đi cũng không có gì sai từ thư mục /etc/cron.hourly, không biết làm thế nào để kiểm tra này? Là nó trong các ứng dụng khởi động? @heemayl - Black Block
Liệu cái /etc/crontab tệp có dòng 17 * * * * root cd / && run-parts --report /etc/cron.hourly ? - heemayl
Ở đây @heemayl mediafire.com/view/7tqg7cr24xc7q0y/Selection_016.png - Black Block
Xin vui lòng không đăng ảnh chụp màn hình của văn bản. Đặc biệt khi văn bản đó được hiển thị trong cửa sổ đầu cuối trong suốt và bao gồm các màu mất tập trung. - terdon♦


Các câu trả lời:


Như bạn có thể đã thấy trong các ý kiến ​​cho câu hỏi của bạn, các cronjobs trong /etc/cron.hourly (và các thư mục tương tự khác) được thực hiện bởi run-parts. run-parts là một chút cầu kỳ về tên tập tin. Theo mặc định, nó không thực thi các tệp có tên tệp chứa bất kỳ thứ gì khác hơn (tất cả các tên tệp từ ASCII)

  • chữ in hoa
  • chữ viết thường
  • chữ số
  • gạch dưới
  • dấu gạch ngang ("dấu trừ")

Vì vậy, nếu tập lệnh của bạn có tên tệp là "myscript.sh", nó chỉ bị bỏ qua, bởi vì run-parts không thích dấu chấm.


18
2018-04-19 22:05



1- Đây là các tệp của tôi: mediafire.com/view/rg8r85xb7qw26zs/cron.hourly_017.png 2- Bạn có thử bất kỳ tập lệnh nào trong /etc/cron.hourly và làm việc với bạn không? - Black Block
Tôi chỉ thử nghiệm một kịch bản litte mà chỉ viết "Hello" vào một tập tin trong / tmp, và nó làm việc mà không có một vấn đề. Chỉ trong trường hợp, bạn nhận thức được rằng các kịch bản trong /etc/cron.hourly không nhất thiết phải được thực hiện "vào giờ"? Nếu cronjob của bạn trong /etc/crontab có 17 ở vị trí phút, các kịch bản được thực hiện tại 00:17, 01:17 và vv. Và một lần nữa, trong trường hợp, quyền của tập lệnh cho phép người dùng root thực thi chúng? - Henning Kockerbeck
Yah nhưng kịch bản của tôi không bao giờ chạy bất cứ lúc nào. và về quyền xem tại đây: mediafire.com/view/psnb4bflawdlyly/… - Black Block
Có lẽ nó thực sự là một vấn đề cho phép. Tôi biết rằng các kịch bản trong tổng quát hơn /etc/cron.d/ không được viết hoặc thực thi quyền cho "nhóm" hoặc "người khác". "chủ sở hữu" cần quyền thực thi, "nhóm" và "những người khác" phải chỉ đọc quyền. Có thể áp dụng cho /etc/cron.hourly là tốt, mặc dù tôi không kiểm tra điều đó. - Henning Kockerbeck
Ok sau đó tôi đã thay đổi quyền cho tệp của tôi mediafire.com/view/s2lq63u7z54ohbo/… làm cho nhóm là nhóm gốc chỉ đọc và những người khác, vậy điều này có gây ra vấn đề gì không? - Black Block


Một vấn đề là bạn đang cố gắng chạy một ứng dụng đồ họa (notify-send) từ cron. Điều đó có một chút tinh chỉnh. Bạn cần phải đặt XAUTHORITY và DISPLAY các biến trong crontab để nó có thể kết nối với phiên X đang chạy của bạn và bạn cần phải thiết lập XDG_RUNTIME_DIR để nó có thể kết nối với phiên pulseaudio của bạn. Thật không may, những thứ này cần được đặt trong chính crontab, vì vậy bạn không thể sử dụng /etc/cron.hourly. Thay vào đó, hãy chạy crontab -e và thêm những dòng này:

DISPLAY=":0.0"
XAUTHORITY="/home/YOURUSERNAME/.Xauthority"
XDG_RUNTIME_DIR="/run/user/1000"

0 * * * * /path/to/script.sh 

Thay đổi giá trị của XDG_RUNTIME_DIR bất cứ điều gì được trả lại khi bạn echo chúng từ một thiết bị đầu cuối. Trên hệ thống của tôi, đây là:

$ echo $XDG_RUNTIME_DIR
/run/user/1001

Nó có thể sẽ giống nhau trên máy của bạn, nhưng hãy kiểm tra trước. Bây giờ, kịch bản của bạn sẽ chạy mỗi giờ và sẽ hoạt động như mong đợi.


4
2018-04-21 10:28



Đó có phải là ý bạn không mediafire.com/view/ucjpvu8b41n3hue/… . điều này không hiệu quả với tôi. - Black Block
Tôi nghĩ rằng nếu vấn đề là trong thông báo gửi thì tại sao lệnh khác không chạy tốt (như mplayer)? - Black Block
@BlackBlock có nhiều vấn đề. tôi) notify-send cần XAUTHORITY và DISPLAY các biến được đặt và ii) mplayer cần XDG_RUNTIME_DIR được thiết lập. Bạn đã thử đề xuất của tôi? Điều đó sẽ khắc phục cả hai vấn đề. Bạn có thể cũng có vấn đề đặt tên vì run-parts như được giải thích trong câu trả lời khác. - terdon♦
Vậy tại sao điều này không hiệu quả với tôi? Tôi sẽ phát điên! xem hình ảnh của tôi trong phần bình luận đầu tiên về câu trả lời của bạn - Black Block
@BlackBlock no! Bạn đang chỉnh sửa /etc/crontabđừng làm thế. Bạn muốn điều này được chạy như là người dùng của bạn, không phải là root và tập tin đó có một định dạng khác nhau anyway. Chỉ cần làm những gì tôi nói trong câu trả lời của tôi, chạy crontab -e và thêm các dòng ở đó. - terdon♦


Tập lệnh kết thúc bằng .sh không được thực hiện trong /etc/cron.hourly thư mục:

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=308911
  Các liên kết hoặc tệp nhị phân bên trong một thư mục được xử lý bởi run-pars (như   /etc/cron.daily) sẽ không chạy nếu giai đoạn là một phần của tên của họ.

đổi tên tập lệnh

mv /etc/cron.hourly/Hour-sound.sh /etc/cron.hourly/Hour-sound

hoặc đặt lệnh gọi script

/etc/crontab

cho phép .sh kết thúc


2
2017-09-29 18:49





Không sử dụng tập lệnh có phần mở rộng (abc.sh) và thêm địa điểm cần thiết của bạn. (cron.hours).

thêm công cụ mã của bạn vào tập tin abc và lưu lại (cho nhu cầu của bạn) (lệnh này sẽ là lệnh bash)

sử dụng

sudo chmod +x abc

lệnh để tạo tệp thực thi.

edit etc/cronrtab file

có một vài line.edit được xác định trước từ hàng phút đến hàng giờ và lưu nó.

sau đó nó sẽ chạy đúng cách.


0
2018-06-24 07:37