Tại sao crontab của tôi không kích hoạt?


29

Tôi đã sử dụng crontab -eđể thêm dòng sau vào crontab của mình:

* * * * * echo hi >> /home/myusername/test

Tuy nhiên, tôi không thấy rằng tệp thử nghiệm được ghi vào. Đây có phải là một vấn đề cho phép, hoặc crontab không hoạt động chính xác?

Tôi thấy rằng quá trình cron đang chạy. Làm thế nào tôi có thể gỡ lỗi này?

Chỉnh sửa - Hỏi Ubuntu có một câu hỏi hay về crontab , tiếc là điều đó vẫn không giúp tôi.

Chỉnh sửa 2 - Hmm, có vẻ như tệp thử nghiệm của tôi có 214 dòng, có nghĩa là trong 214 phút cuối, nó đã được ghi vào mỗi phút. Tôi không chắc vấn đề là gì, nhưng rõ ràng nó đã biến mất.

Câu trả lời:


23

Có các triển khai cron(không phải tất cả trong số chúng và tôi không nhớ đó là gì, nhưng tôi đã gặp một trong Linux) để kiểm tra các tệp crontab được cập nhật mỗi phút vào phút và không xem xét các mục mới cho đến phút tiếp theo . Do đó, một crontab có thể mất tới hai phút để bắn lần đầu tiên. Đây có thể là những gì bạn quan sát.


1
Tôi đoán Solaris, hoặc có thể là Solaris sớm. Tôi có thói quen làm cho mục cron chạy 3-5 phút trong tương lai khi tôi kiểm tra tập lệnh từ mục crontab, bởi vì tôi thường bị lừa bởi hành vi này mọi lúc.
Bruce Ediger 17/03/2016

fcroncũng làm điều này
phunehehe

Điều gì xảy ra nếu thói quen "kiểm tra" tốn hơn một vài phút? Sẽ có những cronjobs nên được kích hoạt trong quá trình "kiểm tra" dài không được kích hoạt này.
ospider

@ospider Việc kiểm tra chỉ mất một phần của giây.
Gilles 'SO- ngừng trở nên xấu xa'

28

Bạn đã thêm một dòng trống sau cronjob của bạn ?


Có một dòng trống sau cronjob của tôi.
ripper234

4
Không phải là một dòng trống, mà là một dòng mới ở cuối dòng cuối cùng. Một tệp văn bản được cho là bao gồm một chuỗi các dòng, mỗi dòng được kết thúc bởi một dòng mới, vì vậy bất kỳ tệp văn bản không trống nào đều kết thúc bằng một ký tự dòng mới. Một số tiện ích không xử lý bất cứ điều gì sau dòng mới nhất trong một tệp.
Gilles 'SO- ngừng trở thành ác quỷ'

1
Đây là câu hỏi về thuật ngữ, "ký tự dòng mới" có nghĩa là "sau khi ký tự này bắt đầu dòng văn bản mới". Vì vậy, 0 byte giữa dòng mới và EOF cuối cùng cũng có thể được coi là một dòng trống ("dòng chứa 0 ký tự")
gelraen 17/03/2016

10

Tôi đã có cùng một vấn đề - một crontab đang hoạt động đột nhiên dừng lại sau khi tôi thêm một mục mới vào cuối. Hóa ra tôi đã quên đặt một dòng mới sau dòng cuối cùng đó.

Tôi phát hiện ra bằng cách ban hành lệnh

cat /var/log/syslog | grep crontab

và đầu ra cho thấy vấn đề:

Jul  2 08:16:01 shiva cron[1254]: (*system*) RELOAD (/etc/crontab)
Jul  2 08:16:01 shiva cron[1254]: (*system*) ERROR (Missing newline before EOF, this crontab file will be ignored)

Thêm dòng mới và tiết kiệm đã khắc phục vấn đề.


5

Âm thanh như thế này là cố định. Lần tới, hãy thử đăng nhập STDERR. Sau đây sẽ chỉ đăng nhập vào STDOUT, không phải STDERR:

* * * * * echo hi >> /home/myusername/test

Cố gắng đảm bảo có một mệnh đề rõ ràng cho STDERR. Mặt khác, STDERR có thể được gửi qua email cho người dùng (giả sử rằng email đang hoạt động) hoặc có thể không đi đến đâu, tùy thuộc vào cách Cron được cấu hình.

* * * * * echo hi >> /home/myusername/test 2> /home/myusername/test.stderr

Sở thích của tôi là gửi đầu ra cronjob đến syslog. Bằng cách đó, tôi đang tận dụng mọi cơ sở hạ tầng syslog hiện có (syslog tập trung, Splunk, xoay vòng nhật ký đã được hỗ trợ, thật dễ dàng để so sánh các tin nhắn trong / var / log / message & / var / log / cronjob, v.v.) spam các sysadmin (tôi) với các email không cần thiết.

* * * * * echo hi >> /home/myusername/test 2>&1 | /usr/bin/logger -t mycronjob

2

Với tôi vấn đề là kịch bản không được thực thi. Tôi đã thiết lập crontab -e như thế này

* * * * * /bin/my-script.sh

Và tập tin myscript không được thực thi nên tôi đã chạy

chmod +x my-script.sh

Ngay lập tức tôi bắt đầu thấy đầu ra như mong đợi.


1

Dòng cron của bạn hoạt động tốt trên máy tính của tôi khi tôi đổi myusernaesang phunehehe. Có một số cách để tìm hiểu những gì sai với hệ thống của bạn.

Cron thường gửi thư cho người dùng khi có sự cố. Nếu bạn thấy thông báo "Bạn có thư", hãy sử dụng ứng dụng thư khách để kiểm tra hộp thư đến của bạn . Hoặc, kiểm tra trong thư mục nhà của bạn, có thể có một tập tin được đặt tên dead.letterở đó.

Bạn có thể kiểm tra /var/log/các mục liên quan đến cron. Trên máy tính của tôi, tệp nhật ký nằm ở /var/log/cron/current(yêu cầu quyền truy cập root).

Nếu bạn có quyền truy cập root, bạn có thể dừng cron daemon và khởi động nó trong chế độ gỡ lỗi. Ví dụ tôi sẽ sử dụng (thay đổi fcrontên của daemon của bạn):

killall fcron
fcron --foreground --debug

Làm thế nào để tôi tìm ra tên của daemon của tôi?
ripper234

@ ripper234 sử dụng ps -ef | grep cronvà bạn sẽ thấy một dòng cho cron của bạn. Kiểm tra trang man của cron để xem cờ gỡ lỗi. Có khả năng là bạn đang sử dụng Vixie Cron , trong trường hợp đó là cờ gỡ lỗi -x. Giết quá trình cron và bắt đầu lại với cờ bổ sung.
phunehehe

Ngoài ra kiểm tra / var / log / syslog. Trong trường hợp của tôi, đã có cảnh báo rằng tệp cron có thể ghi theo nhóm.
đối xử tốt với các mod của bạn vào

1

Rất có thể, khi cron thất bại, nó sẽ tạo một email đến id người dùng của công việc cron trên máy tính đó. Nếu bạn không có MTA hoạt động trên máy tính của mình hoặc bạn không đọc hoặc chuyển tiếp thư đó ở nơi khác, bạn sẽ không thấy tin nhắn đó, ngay cả khi MTA đang hoạt động.

Một cách hay để nhận lỗi của crontab qua thư là làm cho crontab của bạn trông như thế này:

MAILTO="myemail@example.com"
* * * * * echo hi >> /home/myusernae/test

Rõ ràng, sử dụng địa chỉ email của bạn chứ không phải myemail@example.com. Điều này nói với cron gửi lỗi đến địa chỉ email của bạn chứ không phải tài khoản cục bộ. Đặc biệt, điều này rất hữu ích nếu bạn có một crontab gốc (hoặc đoạn crontab trong /etc/cron.d) mà bạn muốn gửi đầu ra cho bạn, bạn có thể tránh spam hộp thư gốc hoặc địa chỉ chuyển tiếp của root.


Tôi không biết hệ thống có cấu hình máy chủ mail / thư đi không. Điều lạ lùng là nó không.
ripper234

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.