Xác minh nếu crontab hoạt động


82

Tôi muốn xác minh nếu một crontab nào đó hoạt động đúng. Tôi đã thêm một công việc như thế này:

  */2 * * * * /path_to_my_php_script/info.php >/dev/null 2>&1

Tôi biết rằng tôi chuyển hướng đến thiết bị null, nhưng tôi không chắc lệnh trên có tốt không.

* Chỉnh sửa 1: Trong / var / log / syslog của tôi cứ sau hai phút tôi lại gặp lỗi sau:

 (CRON) error (grandchild #2788 failed with exit status 2)

* Chỉnh sửa 2: Không có lỗi trong nhật ký với công việc mới này:

 */2 * * * * /usr/bin/php /path_to_my_php_script/info.php >/dev/null 2>&1

tiếc là tất cả ở trên đã cố gắng nhưng không làm việc cho tôi. như bạn nói bản dùng thử / bin / sh -c "(xuất PATH = / bin; /tmp/trial.sh </ dev / null)" hiển thị bên dưới thông báo, không chắc chắn đó là / bin / sh: PATH = / bin : không phải là định danh

Câu trả lời:


73

Cú pháp cho mục crontab có vẻ đúng. Thật vậy, nếu bạn chỉnh sửa crontab của mình bằng cách sử dụng " crontab -e" (như bạn muốn), bạn sẽ gặp lỗi nếu bạn chỉ định một mục nhập crontab không hợp lệ về mặt cú pháp.

  1. Thứ nhất, có /path_to_my_php_script/info.phpchạy đúng từ dòng lệnh không?

  2. Nếu vậy, nó cũng chạy chính xác như thế này?:

    /bin/sh -c "(export PATH=/usr/bin:/bin; /path_to_my_php_script/info.php </dev/null)"
    
  3. Nếu nó hoạt động, nó hoạt động như thế này?

    /bin/sh -c "(export PATH=/usr/bin:/bin; /path_to_my_php_script/info.php </dev/null >/dev/null 2>&1)"
    

Bước (3) tương tự như cách cron sẽ chạy chương trình của bạn (như được ghi trong "man 5 cron".

Vấn đề rất có thể bạn gặp phải là cron PATH đang sử dụng để chạy chương trình của bạn quá hạn chế. Do đó, bạn có thể muốn thêm một cái gì đó như sau vào đầu mục crontab của bạn (bạn sẽ cần thêm vào bất kỳ thư mục nào mà tập lệnh của bạn sẽ cần):

PATH=~/bin:/usr/bin/:/bin

Cũng lưu ý rằng cron sẽ sử dụng theo mặc định /bin/sh, không phải bash. Nếu bạn cần bash, hãy thêm phần này vào phần bắt đầu của tệp crontab của bạn:

SHELL=/bin/bash

Lưu ý rằng cả hai thay đổi này sẽ ảnh hưởng đến tất cả các mục crontab. Nếu bạn chỉ muốn sửa đổi các giá trị này cho info.phpchương trình của mình , bạn có thể làm một cái gì đó như thế này:

*/2 * * * * /bin/bash -c ". ~/.bashrc; /path_to_my_php_script/info.php"

Điều đáng nói là trên một hệ thống được cấu hình cho "mail" (nói cách khác, một hệ thống có MTA được định cấu hình [sendmail / postfix / etc]), tất cả đầu ra từ các chương trình crontab sẽ tự động được gửi đến bạn qua email. Một hệ thống máy tính để bàn Ubuntu mặc định sẽ không được cấu hình thư cục bộ, nhưng nếu bạn đang làm việc trên máy chủ, bạn chỉ cần nhập "thư" trong một thiết bị đầu cuối để xem tất cả các thư điện tử đó. Điều này cũng áp dụng cho atlệnh "".


2
Tôi được phép từ chối cho bước thứ 2. Tôi nên làm gì?
akikara

@akikara chmod + x ./cron.sh - rõ ràng thay thế ./cron.sh bằng bất kỳ vị trí nào trong tệp của bạn mà bạn đang cố chạy
Tisch

46

Mặc dù rất hiếm, đôi khi cron ngừng hoạt động bình thường mặc dù dịch vụ đang chạy. Dưới đây là cách xác minh rằng crond đang chạy và dừng / bắt đầu dịch vụ.

Trên Linux:

service crond status
service crond stop
service crond start

Trên Ubuntu và các hệ thống dựa trên Debian khác:

service cron status
service cron stop
service cron start

13
Chỉ là một ghi chú ... cho Ubuntu cron, không phảicrond
Amit Kohli

32

Không chuyển hướng đầu ra lỗi sang / dev / null và grep / var / log / syslog cho đầu ra cron.

grep cron /var/log/syslog

Bạn có thể ngay lập tức hiển thị lỗi khi lưu tệp sau khi chỉnh sửa /etc/crontabhoặc tệp bên trong /etc/cron.d/với:

tail -f /var/log/syslog | grep --line-buffered cron

Nếu chỉnh sửa ổn, bạn sẽ chỉ thấy RELOADthông báo, lỗi sẽ xảy ra như

Jul 9 09:39:01 vm cron[1129]: Error: bad day-of-month; while reading /etc/cron.d/new 

18

Bạn có thể thấy cron hoạt động của mình bằng lệnh terminal:

crontab -l

Dưới đây là các tham số theo thứ tự:

  1. tối thiểu (0 - 59)

  2. giờ (0 - 23)

  3. ngày trong tháng (1 - 31)

  4. tháng (1 - 12)

  5. ngày trong tuần (0 - 6) (Chủ nhật = 0)

  6. chỉ huy

Vì vậy, bạn đang gọi kịch bản của mình mỗi phút đầu tiên mỗi giờ. Bạn nên kiểm tra đầu ra của mình với khoảng thời gian thường xuyên hơn cho mục đích thử nghiệm:

* * * * * <command> #Runs every minute

Điều này sẽ gọi nó mỗi phút!


* / 2 * * * * tôi đã thay đổi thành hai phút một lần bây giờ
croppio.com


2

Tôi tin rằng bạn cũng có thể sử dụng run-partsđể chạy các công việc cron ngoài băng. Đó thực sự là những gì cron sử dụng chính nó để chạy các công việc cron định kỳ, vì vậy bằng cách cung cấp các đối số phù hợp, bạn có thể chạy chúng bất cứ lúc nào.

Nếu bạn chỉ muốn chạy một tệp thay vì tất cả các công việc định kỳ được xác định trong ví dụ: /etc/cron.dailybạn sẽ phải cung cấp đối số regex cùng với biểu thức chính quy hợp lệ.run-parts --list --regex '^p.*d$' /etc

Hãy nhớ rằng các công việc cron thường được đặt tên mà không có phần mở rộng và được đánh dấu là có thể thực thi được, vì vậy hãy đảm bảo các tập lệnh của bạn tương tự nhau, mặc dù sử dụng regex có thể cho phép bạn kích hoạt tập lệnh có phần mở rộng.


1

Ah !!

Nhận được câu trả lời, tôi đã kiểm tra và không tìm thấy crondtrong thư mục cài đặt mặc định, tức là/etc/init.d/

Bây giờ sẽ thử và trả lời.

lưu ý - Tôi đã kiểm tra cron.allow, cron.denyquá. Tất cả đều ổn cho đến nay.

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.