Magento 1.9.1 cron_schedule không được chọn mãi mãi


12

Tôi đã dành gần 3 ngày và không thể hiểu và tạo ra Magento Cron để xử lý các tác vụ theo lịch trình. Tôi đang chạy Magento 1.9.1.0 và gần đây nhận thấy rằng các email đặt hàng hiện đang được xếp hàng thay vì gửi ngay lập tức. Tôi hiểu sự cần thiết nhưng không thể tạo ra hệ thống để chọn hàng đợi.

Đây là sự nhìn thấy của tôi đối với Cronjob. nhập mô tả hình ảnh ở đây

Đây là dòng lệnh cronjob của tôi. nhập mô tả hình ảnh ở đây

Đây là cách các tác vụ được tạo trong bảng cron_schedule. nhập mô tả hình ảnh ở đây

Vì các bản ghi được tạo trong bảng cron_schedule, tôi nghĩ rằng Cron sẽ chạy một lần trong mỗi 5 phút. Nếu tôi xóa thủ công các bản ghi này qua PhpMyAdmin, các bản ghi sẽ được tạo tự động sau một thời gian.

Nhưng trạng thái của các nhiệm vụ vẫn là 'chờ xử lý' và không bao giờ hoàn thành. Không chắc chắn nếu có gì đó sai trong cấu hình của tôi hoặc tôi đang thiếu bất cứ điều gì. Ai đó có thể vui lòng giúp tôi làm thế nào để thực hiện nhiệm vụ theo lịch trình chạy đúng giờ. Ngoài ra tại sao nhiều bản ghi được tạo cho một mã công việc?

Cập nhật

Tôi xóa toàn bộ bảng và cron tạo ra các công việc theo lịch trình. Tất cả các công việc đang ở trạng thái chờ xử lý và không bao giờ chạy thậm chí chờ hơn 60 phút. Có gì đó không ổn trong Magento 1.9.1

Cập nhật 11/02: Hôm nay tôi đã làm một số phân tích thêm về quá trình.

Tôi đã chỉnh sửa cron.php như dưới đây

echo 'iam before mdefault 1';
shell_exec("/bin/sh $baseDir/cron.sh $fileName -mdefault 1 > /dev/null 2>&1 &");
echo 'iam before malways 1';
shell_exec("/bin/sh $baseDir/cron.sh $fileName -malways 1 > /dev/null 2>&1 &");
echo 'i returned success';

Tôi đã chỉnh sửa lớp Mage_Cron_Model_Observer như bên dưới

public function dispatch($observer) {
  echo 'iam inside dispath';

Sự hiểu biết của tôi là khi cron chạy -mdefault, nó sẽ gọi hàm điều phối và việc thực thi sẽ xảy ra. Nhưng những gì đã xảy ra là như dưới đây trong đầu ra cron.

Content-type: text/html

iam before mdefault 1iam before malways 1i returned success

Nó có nghĩa là công văn không được gọi là ...

Một lần thử khác

Tôi đã tự thay đổi biến $isShellDisabled = true;và tôi đã thay đổi bên dưới trong cron.php.

if ($isShellDisabled) {
  echo 'before always';
  Mage::dispatchEvent('always');
  echo 'after always';
  Mage::dispatchEvent('default');
  echo 'after default';
} else {
  Mage::dispatchEvent($cronMode);
}

Đầu ra cron cho ở trên là như dưới đây

Content-type: text/html

before alwaysiam inside dispath alwaysafter always

Bây giờ nó gọi là 'ClarkAlways' nhưng không phải là 'công văn'

Không có câu trả lời nào giúp tôi. Nó không bao giờ chọn các nhiệm vụ theo lịch trình. Tức là khi Cron chạy lần đầu tiên, nó đã tạo thành công các tác vụ trong bảng. Nhưng nó không bao giờ thực hiện nhiệm vụ.


Điều gì xảy ra khi bạn chạy cron.php từ trình duyệt web? Nó sẽ là một trang trống, nhưng ý tôi là điều gì xảy ra với các nhiệm vụ định kỳ của bạn?
seanbreeden 9/2/2015

Hãy thử sử dụng tập lệnh bash: */5 * * * * /bin/sh PATH_TO_PRODUCTION/cron.shnếu có.
Phil Birnie

@seanbreeden, khi tôi chạy qua URL trên trình duyệt, nó hiển thị một trang trống. Không có gì xảy ra với các nhiệm vụ .. Tôi đã cập nhật câu hỏi với nhóm nhiệm vụ mới được tạo ...
Malaiselvan

@PhilB, .sh không tạo ra sự khác biệt nào. Nó tương tự như các tác vụ đang chờ xử lý đang chờ xử lý nhưng tôi chắc chắn rằng cron đang chạy cứ sau 5 phút.
Malaiselvan 9/2/2015

bạn đã cố gắng để trống cron_schedulebàn? Kiểm tra xem nó có được lấp đầy với các nhiệm vụ mới sau một giờ hay không
Sander Mangel

Câu trả lời:


3

Đó là phiên bản PHP của Cron Jobs.

Phiên bản PHP được đặt chính xác cho trang web, đó là lý do tại sao nó hoạt động; tuy nhiên Cron Jobs đã chạy trên máy chủ PHP 5.3, đó là lý do tại sao tôi chỉ gặp lỗi khi chạy Cron. Tôi đã cập nhật lên phiên bản 5.5.

Thay đổi lệnh Cron:

php /home/mydomainname/public_html/cron.php
to
php55 /home/mydomainname/public_html/cron.php

hoặc trong máy chủ lưu trữ:

/opt/php55/bin/php /home/mydomainname/public_html/cron.php

trong cron.php

$isShellDisabled = (stripos(PHP_OS, 'win') === false) ? $isShellDisabled : true;

Sau dòng này, thêm:

$isShellDisabled = true;

Việc đề cập đến việc chạy cron.php trong một phiên bản PHP cụ thể (trong trường hợp của tôi là php70) đã khắc phục các sự cố tôi đang gặp phải: chạy php -vtrong thiết bị đầu cuối để xem phiên bản PHP nào mà thiết bị đầu cuối đang sử dụng. Trong trường hợp của tôi là 5,6. Vì vậy, tôi đã phải buộc việc sử dụng PHP 7.0 bằng cách thay đổi phpđể ea-php70crontab -e. Cảm ơn!
Daan van den Bergh

2

bạn đã cố gắng để trống cron_schedulebàn? Kiểm tra xem nó có được lấp đầy với các nhiệm vụ mới sau một giờ hay không.

Ngoài ra, bạn có thể sử dụng Aoe_Scheduler để vô hiệu hóa các cronjob cụ thể. Xem nếu bất kỳ một cụ thể có thể gây ra một lỗi dừng tất cả các nhiệm vụ khác.

Cách các cronjobs Magento được thiết lập một lỗi nghiêm trọng trong tập lệnh sẽ khiến việc thực thi tất cả các tác vụ không thành công


Cảm ơn câu trả lời. Có lỗi nghiêm trọng được ghi lại trong bất kỳ nhật ký? Tôi đã cập nhật thêm vài phát hiện về trường hợp của mình và cập nhật tương tự trong câu hỏi của tôi.
Malaiselvan

@seanbreeden: Hôm nay tôi nhận thấy rằng khi tôi khởi chạy Cron.php thông qua trình duyệt web, nó hoạt động rất tốt bằng cách chọn lịch trình. Điều này chứng tỏ không có lỗi nghiêm trọng trong bất kỳ kịch bản nào. Bất cứ ý tưởng tại sao cron không chạy qua crontab?
Malaiselvan

2

Bước đầu tiên tôi sẽ đề nghị hoàn nguyên các cài đặt của bạn trở lại cài đặt cron mặc định của Magento:

Mặc định Magento Cron

Có một vấn đề với cài đặt hiện tại của bạn: lịch trình của bạn được tạo sau mỗi 15 phút nhưng chỉ được lên lịch trước trong 5 phút, để lại khoảng cách 10 phút.


Cảm ơn. Ngay cả sau khi tôi đặt lại về mặc định, nó vẫn không hoạt động. Khi lần đầu tiên chạy, nó tạo ra tất cả các công việc trong bảng cron_schedule với thời gian dự kiến. Các công việc không bao giờ được chọn và ở trong bảng như đang chờ xử lý. Một điều tôi nhận thấy sau khi cài đặt $isShellDisabled = true;và khi tôi khởi chạy Cron.php thông qua trình duyệt, các công việc được chọn nhưng không thông qua CronTab.
Malaiselvan

Vấn đề này vẫn chưa được giải quyết. Sẽ có một vấn đề với nhà cung cấp dịch vụ lưu trữ của tôi. Tôi thấy tập lệnh được kích hoạt theo định kỳ nhưng chỉ các công việc không được chọn. Nó cũng sẽ là một vấn đề kể từ khi tôi di chuyển từ 1.8?
Malaiselvan 20/03/2015

Cronjob của bạn có đủ bộ nhớ? Hãy thử các bản ghi lỗi để xem nếu có bất cứ điều gì trong đó có thể giúp đỡ.
Kristof tại Fooman 22/03/2015

vấn đề này vẫn chưa được giải quyết ... Mỗi ngày tôi đều vỡ đầu. Nhật ký lỗi? Tôi có thể thấy những cái đó ở đâu?
Malaiselvan

@Malaiselvan để biết nhật ký lỗi, vui lòng kiểm tra với quản trị viên hệ thống hoặc webhost của bạn vì họ sẽ biết vị trí và cách truy cập nhật ký lỗi của máy chủ. Ngoài ra, nó có thể giúp chạy thủ công cron từ dòng lệnh - thử cả hai php -f cron.php./cron.shxem liệu chúng có tạo ra bất cứ điều gì để điều tra thêm không.
Kristof tại Fooman

1

Vấn đề tương tự đối với tôi.

"Quá muộn ..." lỗi được tìm thấy.

Sau khi dọn cron_schedulebàn, cron.sh ngừng hoạt động (không lên lịch nữa).

Chỉ hoạt động sau khi giết tất cả các quy trình Cron cũ.


Trong trường hợp của tôi khi Cron chạy lần đầu tiên, nó đã tạo thành công các tác vụ trong bảng. Nhưng nó không bao giờ thực hiện nhiệm vụ. :-(
Malaiselvan

1

Tôi đã từng gặp vấn đề tương tự. Vấn đề của tôi là thời gian cụ thể: các cột created_atscheduled_atcột trong cron_schedulebảng phải là UTC + 0, các mục nhập của tôi là UTC + 2.

Để xác minh điều này, bạn chỉ cần đặt ngày từ created_atscheduled_atđến ngày hôm qua và đợi cho đến lịch trình tiếp theo.

Mong rằng sẽ giúp được ai đó!


1

Trên Bluehost, thay đổi cron.sh

 PHP_BIN=`which php`

đến

 PHP_BIN="php54s"

Theo mặc định trong lưu trữ được chia sẻ, nó chạy PHP 5.2.

Tôi cũng đã phải thay đổi cron.php, thay thế hai $isShellDisableddòng bằng $isShellDisabled = true;

Để thoát khỏi các cảnh báo PHP, tôi cũng đã thêm các dòng này trước

$_SERVER['SCRIPT_NAME'] = 

if (empty($_SERVER['SCRIPT_FILENAME'])) $_SERVER['SCRIPT_FILENAME'] = '~/public_html/cron.php';
if (empty($_SERVER['SCRIPT_NAME'])) $_SERVER['SCRIPT_NAME'] = '/cron.php';
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.