2012-02-21 44 views
7

Một nhu cầu rất phổ biến đối với một ứng dụng là chạy một tập lệnh mỗi X phút/giờ. Về cơ bản nó không có gì phức tạp, chỉ cần một số mã PHP và một mục nhập crontab.Cronjob - làm thế nào để làm điều đó đúng cách?

Mặc dù tôi đã viết khá một vài trong số những cronjobs trong những năm qua tôi vẫn chưa thấy bất kỳ thực hành tốt nhất, ít nhất là không nhiều. Như với mọi "xử lý nền", rất nhiều thứ có thể đi sai, đặc biệt là trong một cài đặt sản xuất.

Trong đó:

  • một lỗi xảy ra trong quá trình thực hiện các cron và kịch bản chết chế biến một nửa số dữ liệu
  • cronjob bị tai nạn bắt đầu hai lần bởi quá trình khác/bởi lỗi người dùng/bất cứ điều gì
  • cronjob mất cách dài hơn dự kiến ​​và kịch bản được gọi là một lần nữa mặc dù nó không thực hiện xử lý dữ liệu
  • , vv

Một số pratices tốt nhất để viết kịch bản cronjob mạnh mẽ và vững chắc bằng đá là gì? Viết một tập tin khóa khẳng định rằng chỉ có một cá thể chạy, mở rộng đăng nhập và giám sát trong oder để ngăn chặn việc gửi hàng ngàn email trùng lặp? Ý tưởng của bạn là gì?

+0

Điều thú vị là bạn đã đăng bài này vì tôi đã nghiên cứu và tự hỏi một số điều tương tự. Trong trường hợp của tôi, tôi thực sự lo lắng về cách thực hiện hiệu quả xử lý ngoại lệ trong một kịch bản lệnh shell mà tôi đang viết. http: // stackoverflow.com/questions/6961389/exception-handling-in-shell-scripting có một số thông tin tốt về điều đó trong trường hợp bạn tò mò. Tôi chủ yếu là một nhà phát triển Java và xử lý ngoại lệ có rất mạnh mẽ nhưng có vẻ khó khăn hơn trong vùng * nix. –

+0

điều này sẽ phụ thuộc vào từng kịch bản được chạy, không có câu trả lời chung, một số cần kiểm tra rất chắc chắn một số ... –

+0

Tôi đã đánh dấu câu hỏi này với dự đoán các câu trả lời sáng tạo với biện minh chi tiết về lợi ích và hạn chế của chúng, và tôi khá thất vọng với câu trả lời "Đây là những gì tôi làm". – nickb

Trả lời

2

Cá nhân, cách tôi xử lý lỗi là chỉ cần gửi STDERR đến tệp nhật ký và sau đó kiểm tra định kỳ tệp đó. Một cách dễ dàng để làm điều đó, là thêm 2>/pathtolog vào mục nhập crontab.

Theo như các bản sao của cùng một chương trình đang chạy, tôi muốn tập lệnh cố khóa thứ gì đó (một tệp hoặc cổng mạng cục bộ). Nếu không lấy được khóa đó, tập lệnh sẽ không chạy. Bằng cách này, nếu một tập lệnh hiện có đang chạy, một tập lệnh mới không thể có được khóa giống hệt nhau.

0

Có rất nhiều việc bạn có thể làm.

Đặt tập lệnh/tập lệnh cron của bạn (tập lệnh tôi đoán vì bạn đã đề cập chúng được viết bằng PHP) để thực thi theo chủ sở hữu hoặc nhóm tùy thuộc vào nhu cầu của bạn.

Nếu bạn muốn đảm bảo rằng chúng chỉ được thực hiện bởi cron thì hãy tạo một người dùng cron là người dùng duy nhất có thể thực thi tập lệnh. Sau đó, thiết lập người dùng đó để chạy nó trong mục nhập crontab của bạn.

Trong kịch bản cron của bạn, đầu ra những điều quan trọng. Chuẩn bị đầu ra của bạn với dấu thời gian/dấu thời gian (tùy thuộc vào tần suất nó chạy). Điều này làm cho nó dễ dàng để grep cho thời gian cụ thể trong tập tin đăng nhập của bạn.

Nối stdout tập lệnh của bạn vào tệp nhật ký bằng cách thêm >> /path/cron.log vào mục nhập crontab của bạn.

Bạn cũng có thể xuất thời gian bắt đầu và thời gian kết thúc của cronjob để mỗi lần bạn có thể phân tích nhật ký để đảm bảo quá trình này không quá chậm.

log file của bạn có thể giống như thế:

[ Tue Feb 20, 2012 ]: 
[ Tue Feb 20, 2012 ]: Executing mycron.php 
[ Tue Feb 20, 2012 ]: 
[ Tue Feb 20, 2012 ]: Running Query: ""SELECT SUM(`clicks`) FROM `matable`"" 
[ Tue Feb 20, 2012 ]: Running Query: ""INSERT INTO `History` (`date`, `total_clicks`) VALUES(CURDATE(), 12324123) 
[ Tue Feb 20, 2012 ]: 
[ Tue Feb 20, 2012 ]: Finished executing mycron.php. Time taken: 3.462 seconds 
[ Tue Feb 21, 2012 ]: 
[ Tue Feb 21, 2012 ]: Executing mycron.php 
[ Tue Feb 21, 2012 ]: 
[ Tue Feb 21, 2012 ]: Running Query: ""SELECT SUM(`clicks`) FROM `matable`"" 
[ Tue Feb 21, 2012 ]: Running Query: ""INSERT INTO `History` (`date`, `total_clicks`) VALUES(CURDATE(), 10376123) 
[ Tue Feb 21, 2012 ]: 
[ Tue Feb 21, 2012 ]: Finished executing mycron.php. Time taken: 2.998 seconds 

Trừ làm bất cứ điều gì nó thay vì những hai truy vấn ngẫu nhiên, tất nhiên.

+0

cronjob để kiểm tra nhật ký của cronjob khác của bạn, nhưng nếu điều đó không thành công thì sao? –

Các vấn đề liên quan