Tại sao cron.d của tôi không chạy công việc mỗi phút?


33

Tôi đã ném một loạt phi tiêu cố gắng để có được một kịch bản trăn của tôi để thực hiện mỗi phút. Vì vậy, tôi nghĩ rằng tôi đã đơn giản hóa nó để chỉ làm "điều đơn giản nhất có thể có thể làm việc" một lần mỗi phút (Tôi đang chạy debian / thử nghiệm).

Tôi đã tạo một tệp dòng duy nhất trong /etc/cron.d/perminute:

* * * * * /bin/touch /home/me/ding_dong

Nó thuộc sở hữu của root và có thể thực thi được (không chắc là một trong những vấn đề đó). Và sau đó tôi đã làm:

sudo service cron reload

Và sau đó ngồi lại và bắt đầu chạy đi chạy ls -ltrlại trong thư mục nhà của tôi ( /home/me). Nhưng tập tin ding_dong của tôi không bao giờ xuất hiện. Tôi biết nếu tôi làm một sudo /bin/touch /home/me/ding_dong, nó xuất hiện ngay lập tức.

Rõ ràng là thiếu một cái gì đó ngu ngốc ở đây.


3
Tải lại dịch vụ cron daemon để áp dụng thay đổi trong cron.d thường là không cần thiết bởi vì nó sẽ giải cứu thư mục cho các tệp mới và cập nhật mỗi phút.
Josip Rodin

Câu trả lời:


45

Khi thêm cấu hình cron vào /etc/cron.d/hoặc trong, /etc/crontabbạn phải thêm tên người dùng trong ngữ cảnh mà lệnh sẽ chạy, trong ví dụ của bạn

* * * * * root /bin/touch /home/me/ding_dong

Và chỉ là một gợi ý từ tôi: bạn không cần phải bắt đầu chạy đi chạy ls -ltrlại, chỉ cần sử dụng watch -n 5 "ls -ltr"và nó sẽ chạy lệnh sau mỗi 5 giây (hoặc bất kỳ giá trị nào khác bằng cách thay thế 5 bằng những gì bạn muốn).


9
Điều này đã cho tôi đi đúng hướng. Đó là một khoảnh khắc headsmack. Tôi đã sửa nó, nhưng nó vẫn không hoạt động. Sau khi đọc man cronchậm hơn một chút và đặc biệt chú ý đến các DEBIAN specificphần, tôi nhận thấy rằng các tệp KHÔNG phải là nhóm hoặc có thể ghi khác. Điều mà tôi đã kích hoạt trong sự thất vọng của tôi tại một thời điểm.
Travis Griggs

Bạn cũng không thể thay đổi chủ sở hữu của tập lệnh thành root?
Lão máu

Dòng cụ thể này đã giúp tôi. Từ man cron: Ngoài ra, trong Debian, cron đọc các tệp trong thư mục /etc/cron.d. cron xử lý các tệp trong /etc/cron.d giống như tệp / etc / crontab (chúng tuân theo định dạng đặc biệt của tệp đó, tức là chúng bao gồm trường người dùng ). Tuy nhiên, chúng độc lập với / etc / crontab: ví dụ, chúng không kế thừa các cài đặt biến môi trường từ nó. Thay đổi này là dành riêng cho Debian, xem ghi chú trong DEBIAN CỤ THỂ bên dưới.
harperville

man 8 cron (trên Debian) cũng nói rằng các tệp trong /etc/cron.d/ chỉ có thể chứa các ký tự chữ và số, '-' và '_'. Cụ thể, không có dấu chấm.
mpartel

3

Để tạo một croncông việc mới , bạn nên chạy crontab -enhư người dùng bạn muốn chạy công việc. Sau đó thêm dòng liên quan trong cửa sổ soạn thảo xuất hiện:

* * * * * /bin/touch /home/me/ding_dong

Cách bạn đang làm nó đòi hỏi một định dạng khác và thực sự không phải là một ý tưởng tốt. Crontabs /etc/cron.dcó định dạng hơi khác nhau, chúng yêu cầu phải chạy tên người dùng. Ví dụ:

* * * * * USERNAME /bin/touch /home/me/ding_dong

Một mẹo hay (như được đề xuất bởi @VogonPoetLaureate) là nắm bắt lỗi tiêu chuẩn của các công việc định kỳ của bạn có thể giúp gỡ lỗi chúng. Ví dụ:

* * * * * /bin/touch /home/me/ding_dong 2>/tmp/error

6
Hoàn toàn không có lý do để nói rằng cron.d là "không phải là một ý tưởng tốt". Trình nền cron sẽ gửi thư đầu ra cron.d stderr đến tên người dùng và nếu bạn muốn chuyển hướng nó đến một địa chỉ email khác, biến MAILTO có sẵn.
Josip Rodin

@JosipRodin không phải là ý tưởng hay cho những thứ không được chạy bằng root và do bạn thiết lập. Thật ý nghĩa cho một sysadmin trên hệ thống nhiều người dùng nhưng trên máy của riêng bạn, việc có mọi thứ trong crontab của bạn sẽ đơn giản hơn nên chỉ có một nơi để kiểm tra và crontab -lliệt kê tất cả các công việc định kỳ của bạn.
terdon

Điều đó giả định rằng đó thực sự chỉ là một công việc định kỳ cá nhân, mà OP không thực sự làm rõ - nói chung, có rất nhiều ứng dụng cho các công việc cron người dùng không có đặc quyền được thiết lập thông qua cron.d, chẳng hạn như giữ tất cả chúng ở một nơi mặc dù thực tế bạn có người dùng dịch vụ được sắp xếp lại, triển khai tự động dễ dàng hơn, v.v.
Josip Rodin

@JosipRodin hoàn toàn. Tôi giả sử một hệ thống cá nhân vì i) hệ thống doanh nghiệp không có chủ đề ở đây và ii) câu hỏi gợi ý người dùng không phải là chuyên gia.
terdon

OK, tôi đoán rằng tôi không còn đọc được điều đó vì sự nhầm lẫn phổ biến giữa superuser và serverfault và unix các trang SE :)
Josip Rodin

2

Một lỗi có thể xảy ra ở đây là cách tạo một tệp dòng đơn . Từ Tài liệu Ubuntu :

... dòng có năm trường thời gian, theo sau là một lệnh, theo sau là một ký tự dòng mới .

Ví dụ: cách tạo này không hoạt động:

printf "* * * * * /bin/touch /home/me/ding_dong" > /etc/cron.d/ding_dong
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.