Cron ngừng chạy; Nhật ký nói rằng: Cố gắng chạy lại cron khi nó đang chạy.


11

Các bước để khắc phục sự cố và giải quyết vấn đề này theo tiêu đề là gì?

Khi tôi cố chạy thủ công, tôi nhận được một trang ngay lập tức và thông báo lỗi "Đang cố chạy lại cron khi nó đang chạy."


Tôi không thể nhớ ra khỏi đỉnh đầu của mình những gì trong db cron nhìn vào, nhưng một google nhanh chóng "cố gắng chạy lại cron trong khi nó đang chạy" đã chỉ cho tôi đến digitaledgesw.com/node/21 , nó có thể áp dụng cho D7
Jimajamma

Điều đó rất lạ. Thông báo đó được tìm thấy chính xác một lần trong mã cho lõi, ngay sau khi kiểm tra biến đó (thông qua lock_acquire trong drupal_cron_run). Nếu bạn đăng thêm thông tin / triệu chứng chỉ ra rằng nó thực sự khác biệt, tôi sẽ mở lại.
mpdon Arena

Gợi ý: bạn có thể thử cài đặt một Drupal mới và đặt cron chạy cứ sau 3 phút và xem bạn có hiệu quả tương tự không !!!
Aboodred1

Chỉ cần chạy:drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"
kenorb

4
ĐỐI VỚI NGƯỜI ĐỌC TƯƠNG LAI: Câu trả lời hiện được chấp nhận là không chính xác đối với Drupal 7, phiên bản Drupal mà câu hỏi là. Nó có hiệu lực đối với Drupal 6, nhưng mã Drupal 7 đã thay đổi; điều đó chỉ xảy ra khi Drupal 7 vẫn còn từ Drupal 6 chưa được dọn sạch.
kiamlaluno

Câu trả lời:


12

Các semaphore cron có lẽ đã bị khóa. Bạn có thể thử gọi drupal_cron_cleanup () từ bất kỳ nơi nào trong mã của bạn (điều đó không xảy ra để được gọi bởi cron) và điều đó sẽ mở khóa biến semaphore của bạn.

Nếu bạn đã cấu hình drush trong Drupal 6, bạn cũng có thể thử:

$ drush vdel -y cron_semaphore

3
Hoặc xóa thủ công khỏi bảng biến nếu bạn có quyền truy cập db chứ không phải drush.
Malks

8
Đừng quên những giá trị này được lưu trong bảng cache_bootstrap.
tostinni

1
xin vui lòng tên chính xác của bảng là gì vì tôi đã không tìm thấy bất kỳ cron_semaphore nào trong bảng biến
mohammed amine bourkadi 11/03/13

2
Khi tôi chạy lệnh drush ở trên, tôi nhận được "cron_semaphore không tìm thấy." Có ý kiến ​​gì không?
Nigel Waters

1
@NigelWaters Cron semaphore đã trở thành một khóa, trong Drupal 7, nhưng drupal_cron_cleanup()dường như không được cập nhật.
kiamlaluno

19

Tóm lược

Thông báo lỗi bạn đang thấy sẽ xảy ra nếu đáp ứng hai điều kiện sau:

  • Công việc cron của bạn không hoàn thành (lỗi) hoặc mất hơn 4 phút để hoàn thành;
  • Bạn gọi cron thường xuyên hơn cứ sau 4 phút (Theo cài đặt crontab của bạn, không phải cài đặt trong Drupal)

Do đó, thông báo lỗi này là một triệu chứng của các tác vụ cron bị lỗi hoặc mất quá nhiều thời gian để chạy. (Lưu ý: Tôi nhận ra rằng bạn đã tìm thấy thủ phạm, nhưng tôi muốn thêm câu trả lời cho những người tìm thấy trang này thông qua các tìm kiếm, như tôi đã làm)

Lý lịch

Điều đầu tiên cần hiểu là làm thế nào các nhiệm vụ cron Drupal được chạy. Cron Drupal được gọi theo định kỳ - thông qua công việc định kỳ trên máy chủ của bạn hoặc sau mỗi lần tải trang nếu bạn sử dụng cron của người nghèo là mặc định của Drupal.

Tuy nhiên, các tác vụ cron không nhất thiết phải chạy mỗi khi cron được gọi - tuy nhiên, có một cài đặt trong Drupal (mặc định là 3 giờ) cho biết tần suất các tác vụ cron nên được chạy. Nhưng sự chậm trễ 3 giờ này chỉ áp dụng nếu các tác vụ cron đã kết thúc thành công.

Trong Drupal 7, cron sử dụng các cơ chế khóa của Drupal , cung cấp một hệ thống khóa tư vấn hợp tác. Một trong những tính năng của hệ thống khóa này là khóa hết hạn sau một thời gian nhất định. Trong trường hợp của cron, nó sẽ hết hạn sau 4 phút - vì vậy nếu cron của bạn được gọi cứ sau 3 phút và công việc cron trước đó chưa kết thúc vào thời điểm đó (có thể bị hỏng hoặc rất chậm), bạn thực sự sẽ nhận được thông báo lỗi này .

Thực tế là bạn đặt cron cứ sau 12 giờ không tạo ra sự khác biệt - vì nhiệm vụ cron Drupal không thành công / mất quá nhiều thời gian, Drupal cho rằng nó đã không được chạy nên cố gắng chạy lại ngay khi cron được gọi. Việc trì hoãn mười hai giờ chỉ áp dụng cho các lần chạy cron thành công.

Biến cron semaphore không còn tồn tại nữa trong Drupal 7 - đây là phiên bản cũ của Drupal. Trong Drupal 7 không có cách nào đáng tin cậy để phát hành khóa theo cách thủ công, vì phụ trợ khóa có thể thay đổi - tuy nhiên nếu bạn đang sử dụng cơ chế khóa lõi thì bạn có thể giải phóng khóa cron bằng cách chỉnh sửa cơ sở dữ liệu:

DELETE FROM semaphore WHERE name = 'cron';

Nhưng bằng cách này, bạn sẽ chỉ khắc phục được các triệu chứng - vấn đề cần giải quyết là tại sao cron bị lỗi / mất quá nhiều thời gian để chạy.


Tôi nhận được thông báo này, nhưng khi tôi chạy cron_debug, tất cả các công việc cron đều kết thúc thành công và chạy nhanh (ngoại trừ các bản cập nhật cốt lõi mất ~ 5 giây). Nếu nguồn gốc của vấn đề này là chậm hoặc thất bại các thói quen cron, tại sao cron_debug không làm nổi bật chúng?
ngờ1ejack

1
Tôi không biết mô-đun cron_debug hoạt động như thế nào, vì vậy tôi thực sự không thể nhận xét về điều này. Giá trị của biến 'cron_safe_thr Ngưỡng' là gì? Dữ liệu nào là bảng 'semaphore'?
Alice Heaton

1
Đây là câu trả lời đúng cho Drupal 7. +1 cho phần giải thích chi tiết.
kiamlaluno

BTW, nếu cron không thành công với bạn, hãy sử dụng các mô-đun Cron Debug để xem mô-đun nào bị treo - 9 lần trong số 10 mô-đun Tìm kiếm. Hãy thử tắt mô-đun tìm kiếm sau đó chạy cron thủ công và xem điều gì sẽ xảy ra. Để tìm các nút, nó đang cố gắng lập chỉ mục: drupal.stackexchange.com/questions/22825/NH
Dan Mantyla

4

Các cron_semaphorebiến đã tồn tại trong Drupal 6, nhưng bạn đang sử dụng Drupal 7, do đó ổ khóa semaphore chuyển vào bảng riêng biệt gọi là semaphore.

Vì vậy, giải pháp để mở khóa semaphore sẽ là:

Drupal 7

drush sqlq "TRUNCATE semaphore"

Drupal 6

drush -y vdel cron_semaphore 

3
Biến thể "ít cực đoan hơn" cho Drupal 7:drush sql-query "DELETE FROM semaphore WHERE name='cron'"
tanius

2

Bạn có thể gỡ lỗi cron bằng cách sử dụng mô-đun Cron Debug .

Cron Debug sẽ giúp bạn tìm các quy trình cron

  • lỗi do lập trình hoặc lỗi thời gian chạy
  • hết thời gian (PHP, máy chủ, cơ sở dữ liệu)
  • rất chậm

Cron Debug cũng sẽ cho phép bạn kiểm tra các chức năng cron cụ thể trong khi không chạy các chức năng khác. Điều này có thể tốt cho việc phát triển các chức năng cron khi bạn không muốn chạy một cron.php đầy đủ với tất cả các bảo trì, cảnh báo và các tác vụ khác mỗi khi bạn kiểm tra chức năng của chính mình.


1
Mô-đun này là một cứu tinh cho tôi!
Dan Mantyla

yeah, mô-đun này là tốt, nó giúp gỡ lỗi công việc cron.
Nishant

1

Đây là cách tôi giải quyết vấn đề định kỳ:

  1. Qua PhpMyAdmin, tôi nhìn vào bảng semaphore và xóa hàng ở đâu name = cron
  2. Tôi đã chạy "drush cron" qua dòng lệnh
  3. Tôi thấy một thông báo lỗi cho tôi manh mối về vấn đề này; điều này có thể khác với bạn, nhưng đối với tôi, một mô-đun được gỡ cài đặt gần đây đang chia sẻ thư viện PHP với mô-đun đã cài đặt đã gây ra lỗi

0

Đối với Drupal 8: drush sqlq "XÓA TỪ semaphore WHERE name = 'cron';"


0

Trên Drupal 7, như một lựa chọn khác,

Qua drush crontôi đã nhận được,

WD cron: Attempting to re-run cron while it is already running.       [warning]
Cron run failed.                                                      [error]

Đây là trên môi trường phát triển và đã xảy ra vì một cron trước đó đang chạy và bị gián đoạn.

Trên includes/common.inc, tại dòng 5413 hoặc xung quanh, bạn sẽ tìm thấy khối này, https://cgit.drupalcode.org/drupal/tree/includes/common.inc?h=7.x#n5413

  // Try to acquire cron lock.
  if (!lock_acquire('cron', 240.0)) {
    // Cron is still running normally.
    watchdog('cron', 'Attempting to re-run cron while it is already running.', array(), WATCHDOG_WARNING);
  }

Sửa đổi ifvới một && FALSE,

  // Try to acquire cron lock.
  if (!lock_acquire('cron', 240.0) && FALSE) {
    // Cron is still running normally.
    watchdog('cron', 'Attempting to re-run cron while it is already running.', array(), WATCHDOG_WARNING);
  }

Và chạy lại cron. Điều đó sẽ cho phép nó chạy.

Vui lòng không triển khai cái này và hoàn nguyên nó sau khi nó kết thúc. Nó cũng giúp gỡ lỗi.


-1

Tôi đã chống lại điều này một vài lần. Trong Drupal 6 Nếu bạn không sử dụng drush, bạn có thể sửa nó như thế này:

1 Xóa các biến cron_% khỏi bảng biến.

SELECT * FROM variable WHERE name like "cron%";

DELETE FROM variable WHERE name like "cron%";

Xóa 2 bộ đệm Drupal tại: / admin / settings / Performance

bằng cách nhấn nút 'xóa dữ liệu được lưu trong bộ nhớ cache' ở cuối trang.

3 chạy cron từ bảng quản trị / quản trị viên / báo cáo / trạng thái / run-cron không chạy nó từ dòng comand vì điều này có thể gây ra vấn đề.

4 Kiểm tra xem lần chạy cron tự động tiếp theo có hoàn thành như bình thường không.


Chào mừng đến với câu trả lời của Drupal! Câu hỏi là về Drupal 7. Xóa các hàng khỏi bảng cơ sở dữ liệu đó sẽ không có nhiều tác dụng.
kiamlaluno

Ah tôi chỉ thêm câu trả lời vì nó đã không nói cụ thể rằng nó dành cho Drupal 7 trong OP. Điều đó hoạt động tốt cho drupal 6, và đầy đủ hơn các câu trả lời 'xóa semaphore' thông thường. tôi đoán nó sẽ hữu ích nếu có ai kết thúc ở đây từ d6. Điều đó có sai không? Tôi dường như đã được đánh dấu xuống cho nó.
munkiepus

vừa cập nhật để loại bỏ cron chạy khỏi phần dòng lệnh, chỉ cần phát hiện ra nó có thể gây ra sự cố
munkiepus

-1

Bạn có thể gỡ lỗi bằng cách sử dụng xdebug, chạy cron từ giao diện quản trị Admin> Cấu hình> hệ thống> cron.

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.