2009-05-12 39 views
9

Tôi có một công việc cron thực hiện một tập lệnh PHP. Cron được thiết lập để chạy mỗi phút, điều này được thực hiện chỉ cho mục đích thử nghiệm. Tập lệnh PHP mà nó đang thực thi được thiết kế để chuyển đổi các video được người dùng tải lên máy chủ sang định dạng flash (ví dụ ... .flv). Kịch bản thực hiện tốt khi tự làm nó thông qua dòng lệnh, tuy nhiên khi thực hiện thông qua cron nó bắt đầu tốt nhưng sau một phút nó chỉ dừng lại.Công việc cron có thực hiện việc hủy cron cuối cùng không?

Dường như khi cron tiếp theo được thực thi, nó sẽ "giết" cron thực thi cuối cùng. tôi đã thêm chức năng PHP sau:

ignore_user_abort(true); 

Trong hy vọng rằng nó sẽ không hủy bỏ việc thực hiện cuối cùng, tôi được thử nghiệm thiết lập cron để chạy mỗi 5 phút, trong đó hoạt động tốt, tuy nhiên một chuyển đổi video có thể mất hơn 5 phút vì vậy tôi cần phải tìm ra lý do tại sao nó dừng lại khi một cron khác được thực hiện.

Mọi trợ giúp sẽ được đánh giá cao.

Cảm ơn bạn!

EDIT: cron của tôi trông giống như:

*/1 * * * * php /path_to_file/convert.php 
+0

Bạn đã kiểm tra nhật ký lỗi PHP chưa? Bạn đã sử dụng set_time_limit để đặt giới hạn thời gian thành 0? –

+0

Không có lỗi nào xảy ra, tôi cũng đặt giới hạn thời gian là 0. Tôi quên đề cập trước đó cron của tôi trông giống như:

 */1 * * * * php /path_to_file/convert.php 
Cảm ơn! –

+0

Dường như công việc định kỳ không ghi đè lên những gì đang làm việc cuối cùng, có một cái gì đó bị lỗi trong mã PHP. Tôi thêm một kiểm tra để chắc chắn rằng nó thoát, tuy nhiên thêm một tập tin khóa tạm thời mà Sander đã đề cập làm việc một cách hoàn hảo. Cảm ơn! –

Trả lời

17

Tôi không nghĩ rằng cron sẽ giết bất kỳ quy trình nào. Tuy nhiên, cron không thực sự thích hợp cho các quy trình chạy dài. Những gì có thể xảy ra ở đây là kịch bản của bạn chà đạp khắp chính nó khi nó được thực thi nhiều lần. Ví dụ, cả hai quy trình PHP có thể đang cố ghi vào cùng một tệp cùng một lúc.

Trước tiên, hãy đảm bảo bạn không chỉ tìm trong nhật ký lỗi php mà còn cố gắng ghi lại đầu ra từ chính tệp PHP. Ví dụ:

*/1 * * * * * php /path/to/convert.php & >> /var/log/convert.log 

Bạn cũng có thể sử dụng tệp khóa đơn giản để đảm bảo convert.php không được thực hiện nhiều lần. Một cái gì đó như:

if (file_exists('/tmp/convert.lock')) { 
    exit(); 
} 

touch('/tmp/convert.lock'); 
// convert here 
unlink('/tmp/convert.lock'); 
+3

cron S NOT KHÔNG giết quá trình. Các kịch bản (hoặc một cái gì đó kịch bản được gọi) là nhận được theo cách riêng của nó. –

3

cron tự nó sẽ không dừng lại một trường hợp trước đó của một công việc chạy như vậy, nếu có một vấn đề, có gần như chắc chắn một cái gì đó trong chương trình PHP làm việc đó. Bạn sẽ cần phải đăng mã đó.

1

Không, nó sẽ không. Bạn có thể giữ một quy trình thứ hai chạy bằng cách tạo tệp khóa mà tập lệnh kiểm tra trên mỗi lần chạy. Nếu tập tin tồn tại, nó không chạy. Điều này cũng nên, nếu thích hợp, được sử dụng kết hợp với thời gian thực hiện tối đa để một quá trình không ngừng thực thi trong tương lai vô thời hạn. Tệp khóa có thể chỉ là một tệp văn bản thuần túy trống có tên /tmp/foo.lock.

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