Cron หยุดทำงาน บันทึกบอกว่า: "ความพยายามที่จะเรียกใช้ cron อีกครั้งในขณะที่มันกำลังทำงานอยู่"


11

ขั้นตอนในการแก้ไขปัญหาและแก้ไขปัญหานี้ตามชื่อเรื่องคืออะไร

เมื่อฉันพยายามเรียกใช้ด้วยตนเองฉันจะได้รับหน้าทันทีและข้อความแสดงข้อผิดพลาด "พยายามเรียกใช้ cron อีกครั้งในขณะที่ทำงานอยู่"


ฉันจำไม่ได้ว่าบนหัวของฉันมีอะไรใน db cron มอง แต่ google อย่างรวดเร็วของ "พยายาม re-run cron ในขณะที่มันกำลังทำงานอยู่" ชี้ให้ฉันไปที่digitaledgesw.com/node/21มันอาจ ใช้กับ D7
Jimajamma

มันแปลกมาก ข้อความนั้นถูกพบเพียงครั้งเดียวในรหัสของคอร์หลังจากตรวจสอบตัวแปรแล้ว (ผ่าน lock_acquire ใน drupal_cron_run) หากคุณโพสต์ข้อมูลเพิ่มเติม / อาการที่ชี้ว่ามันแตกต่างกันแน่นอนฉันจะเปิดมันอีกครั้ง
mpdonadio

คำแนะนำ: คุณสามารถลองติดตั้ง Drupal ใหม่และตั้ง cron ให้ทำงานทุก ๆ 3 นาทีและดูว่าคุณมีเอฟเฟกต์เดียวกันหรือไม่ !!!
Aboodred1

เพิ่งรัน:drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"
kenorb

4
ถึงผู้อ่านในอนาคต:คำตอบที่ยอมรับในปัจจุบันไม่ถูกต้องสำหรับ Drupal 7 ซึ่งเป็นรุ่น Drupal ที่เป็นคำถาม ใช้ได้กับ Drupal 6 แต่เปลี่ยนรหัส Drupal 7 มันเพิ่งเกิดขึ้นที่ Drupal 7 ยังคงมาจาก Drupal 6 ที่ยังไม่ได้รับการทำความสะอาด
kiamlaluno

คำตอบ:


12

สัญญาณ cron อาจถูกล็อค คุณสามารถลองโทรdrupal_cron_cleanup ()จากที่ใดก็ได้ในรหัสของคุณ (ซึ่งไม่ได้เกิดจาก cron เรียก) และควรปลดล็อคตัวแปรสัญญาณ cron ของคุณ

หากคุณตั้งค่า Drush ใน Drupal 6 คุณสามารถลอง:

$ drush vdel -y cron_semaphore

3
หรือลบออกด้วยตนเองจากตารางตัวแปรหากคุณมีการเข้าถึงฐานข้อมูลแทนที่จะเป็น drush
Malks

8
cache_bootstrapอย่าลืมค่าเหล่านี้จะถูกเก็บไว้ในตาราง
tostinni

1
กรุณาชื่อที่แน่นอนของตารางคืออะไรเพราะฉันไม่พบ cron_semaphore ในตารางตัวแปร
โมฮัมเหม็ด Amine bourkadi

2
เมื่อฉันรันคำสั่ง drush ด้านบนฉันจะได้รับ "cron_semaphore ไม่พบ" ความคิดใด ๆ
Nigel Waters

1
@NigelWaters สัญญาณ cron กลายเป็นล็อคใน Drupal 7 แต่drupal_cron_cleanup()ดูเหมือนว่าจะไม่ได้รับการปรับปรุง
kiamlaluno

19

สรุป

ข้อความแสดงข้อผิดพลาดที่คุณเห็นจะเกิดขึ้นหากตรงตามเงื่อนไขสองข้อต่อไปนี้:

  • คุณ cron งานไม่เสร็จ (ข้อผิดพลาด) หรือใช้เวลานานกว่า 4 นาทีเพื่อให้เสร็จ;
  • คุณเรียกใช้ cron บ่อยกว่าทุก ๆ 4 นาที (ตามการตั้งค่า crontab ของคุณไม่ใช่การตั้งค่าใน Drupal)

ข้อความแสดงข้อผิดพลาดนี้จึงเป็นอาการของงาน cron ที่ล้มเหลวหรือใช้เวลาในการรันนานเกินไป (หมายเหตุ: ฉันรู้ว่าคุณได้พบผู้กระทำผิดแล้ว แต่ฉันต้องการเพิ่มคำตอบสำหรับผู้ที่ค้นหาหน้านี้ผ่านการค้นหาอย่างที่ฉันทำ)

พื้นหลัง

สิ่งแรกที่ต้องทำความเข้าใจก็คือการทำงานของ cron ของ Drupal ได้อย่างไร Drupal cron ถูกเรียกใช้ในช่วงเวลาปกติ - ผ่านงาน cron บนเซิร์ฟเวอร์ของคุณหรือหลังจากโหลดหน้าเว็บทุกครั้งหากคุณใช้ cron ของคนจนซึ่งเป็นค่าเริ่มต้นของ Drupal

งาน cron นั้นไม่จำเป็นต้องเรียกใช้ทุกครั้งที่มีการเรียกใช้ cron - มีการตั้งค่าใน Drupal (ค่าเริ่มต้นคือ 3 ชั่วโมง) ซึ่งระบุว่าควรทำงาน cron บ่อยแค่ไหน แต่การหน่วงเวลา 3 ชั่วโมงนี้จะมีผลเฉพาะถ้างาน cron เสร็จสมบูรณ์

ใน Drupal 7 cron ใช้กลไกการล็อคของ Drupal ซึ่งให้ความร่วมมือกับระบบล็อคที่ปรึกษา หนึ่งในคุณสมบัติของระบบล็อคนี้คือล็อคหมดอายุหลังจากเวลาที่กำหนด ในกรณีของ cron มันจะหมดอายุหลังจาก 4 นาที - ดังนั้นถ้า cron ของคุณถูกเรียกใช้ทุก 3 นาทีและงาน cron ก่อนหน้านี้ยังไม่เสร็จตามเวลานั้น (ไม่ว่ามันจะล้มเหลวหรือช้ามาก) คุณจะได้รับข้อความแสดงข้อผิดพลาดนี้แน่นอน .

ความจริงที่คุณตั้งค่า cron ให้เป็นทุก ๆ 12 ชั่วโมงนั้นไม่ได้สร้างความแตกต่าง - เนื่องจากงาน Drupal cron ล้มเหลว / ใช้เวลานานเกินไป Drupal จะถือว่ามันไม่ได้ถูกเรียกใช้ดังนั้นพยายามเรียกใช้อีกครั้งทันทีที่ cron ถูกเรียกใช้ การหน่วงเวลาสิบสองชั่วโมงจะใช้กับ cron ที่ประสบความสำเร็จเท่านั้น

ตัวแปรสัญญาณ cron ไม่มีอยู่อีกต่อไปใน Drupal 7 - นี่เป็นรุ่นที่เก่ากว่าของ Drupal ใน Drupal 7 ไม่มีวิธีที่เชื่อถือได้ในการปลดล็อคด้วยตนเองเนื่องจากแบ็คเอนด์ล็อคอาจเปลี่ยนแปลง - แต่ถ้าคุณใช้กลไกการล็อคแกนคุณสามารถปลดล็อค cron โดยการแก้ไขฐานข้อมูล:

DELETE FROM semaphore WHERE name = 'cron';

แต่การทำเช่นนี้คุณจะสามารถแก้ไขอาการได้ - ปัญหาที่ต้องกล่าวถึงคือทำไม cron จึงไม่ทำงาน / ใช้เวลานานมาก


ฉันได้รับข้อความนี้ แต่เมื่อฉันเรียกใช้ cron_debug งาน cron ทั้งหมดจบลงด้วยความสำเร็จและทำงานได้อย่างรวดเร็ว (ยกเว้นการอัปเดตหลักซึ่งใช้เวลาประมาณ 5 วินาที) หากที่มาของปัญหานี้ช้าหรือไม่สามารถรูทีน cron ทำไม cron_debug ไม่เน้นสีเหรอ?
doub1ejack

1
ฉันไม่ทราบว่าโมดูล cron_debug ทำงานอย่างไรดังนั้นฉันจึงไม่สามารถออกความเห็นเกี่ยวกับเรื่องนี้ ค่าของตัวแปร 'cron_safe_threshold' คืออะไร ตารางข้อมูล 'สัญญาณ' คืออะไร?
Alice Heaton

1
นี่คือคำตอบที่ถูกต้องสำหรับ Drupal 7 +1 สำหรับคำอธิบายโดยละเอียด
kiamlaluno

BTW ถ้า cron ล้มเหลวสำหรับคุณให้ใช้โมดูล Cron Debug เพื่อดูว่าโมดูลนั้นวางสายเมื่อไร - 9 ครั้งจากทั้งหมด 10 นั่นคือโมดูลการค้นหา ลองปิดโมดูลการค้นหาแล้วเรียกใช้ cron ด้วยตนเองและดูว่าเกิดอะไรขึ้น เพื่อค้นหาโหนดที่พยายามทำดัชนี: drupal.stackexchange.com/questions/22825/…
Dan Mantyla

4

cron_semaphoreตัวแปรได้อยู่ใน Drupal 6 แต่คุณกำลังใช้ Drupal 7 semaphoreเพื่อล็อคสัญญาณย้ายเข้าไปอยู่ในตารางแยกต่างหากที่เรียกว่า

ดังนั้นวิธีการปลดล็อคสัญญาณ cron จะเป็น:

Drupal 7

drush sqlq "TRUNCATE semaphore"

Drupal 6

drush -y vdel cron_semaphore 

3
ตัวแปร "น้อยสุดขีด" สำหรับ Drupal 7:drush sql-query "DELETE FROM semaphore WHERE name='cron'"
tanius

2

คุณสามารถดีบัก cron ได้โดยใช้โมดูลCron Debug

Cron Debug จะช่วยคุณค้นหากระบวนการ cron ที่

  • ล้มเหลวเนื่องจากข้อผิดพลาดในการเขียนโปรแกรมหรือรันไทม์
  • หมดเวลา (PHP, เซิร์ฟเวอร์, ฐานข้อมูล)
  • ช้ามาก

Cron Debug จะช่วยให้คุณทดสอบการใช้งานฟังก์ชั่น cron เฉพาะในขณะที่ไม่ใช้งานฟังก์ชั่นอื่น ๆ นี่เป็นสิ่งที่ดีสำหรับการพัฒนาฟังก์ชั่น cron ที่คุณไม่ต้องการเรียกใช้ cron.php เต็มรูปแบบด้วยการบำรุงรักษาการแจ้งเตือนและงานอื่น ๆ ทุกครั้งที่คุณทดสอบฟังก์ชั่นของคุณเอง


1
โมดูลนี้ช่วยชีวิตฉันได้!
Dan Mantyla

ใช่โมดูลนี้ดีมันช่วยในการแก้ปัญหางาน cron
Nishant

1

นี่คือวิธีที่ฉันแก้ไขปัญหา cron:

  1. ผ่าน PhpMyAdmin ฉันดูในตารางสัญญาณและลบแถวที่ name = cron
  2. ฉันวิ่ง "drush cron" ผ่านทางบรรทัดคำสั่ง
  3. ฉันเห็นข้อความแสดงข้อผิดพลาดที่ทำให้ฉันทราบถึงปัญหา อาจแตกต่างกันสำหรับคุณ แต่สำหรับฉันโมดูลที่เพิ่งถอนการติดตั้งเมื่อเร็ว ๆ นี้ซึ่งแชร์ไลบรารี PHP กับโมดูลที่ติดตั้งทำให้เกิดข้อผิดพลาด


0

ใน Drupal 7 เช่นเดียวกับตัวเลือกอื่น

ผ่านdrush cronฉันได้รับ

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

นี่คือสภาพแวดล้อมการพัฒนาและเกิดขึ้นเพราะ cron ก่อนหน้านี้ทำงานและถูกขัดจังหวะ

ในincludes/common.incบรรทัดที่ 5413 หรือใกล้เคียงคุณจะพบบล็อกนี้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);
  }

ปรับเปลี่ยนifกับ&& 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);
  }

และวิ่งใหม่ cron ที่จะยอมให้มันวิ่ง

โปรดอย่าปรับใช้สิ่งนี้และเปลี่ยนกลับเป็นหลังจากเสร็จสิ้น นอกจากนี้ยังช่วยในการแก้ไขข้อบกพร่อง


-1

ฉันมากับเรื่องนี้สองสามครั้ง ใน Drupal 6 หากคุณไม่ใช้ drush คุณสามารถแก้ไขได้ดังนี้:

1 ลบตัวแปร cron_% ออกจากตารางตัวแปร

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

DELETE FROM variable WHERE name like "cron%";

2 ล้างแคช Drupal ที่: / admin / settings / performance

โดยกดปุ่ม 'ล้างข้อมูลแคช' ที่ด้านล่างของหน้า

3 run cron จาก admin panel / admin / reports / status / run-cron ไม่ได้รันจาก comand line เพราะอาจทำให้เกิดปัญหาได้

4 ตรวจสอบว่าการเรียกใช้ cron อัตโนมัติครั้งต่อไปเสร็จสมบูรณ์ตามปกติ


ยินดีต้อนรับสู่ Drupal Answers! คำถามเกี่ยวกับ Drupal 7 การลบแถวจากตารางฐานข้อมูลนั้นจะไม่มีผลมากนัก
kiamlaluno

อ่าฉันเพิ่งเพิ่มคำตอบเพราะมันไม่ได้พูดเฉพาะว่ามันเป็นของ Drupal 7 ใน OP ใช้งานได้ดีสำหรับ drupal 6 และสมบูรณ์กว่าคำตอบ 'ลบสัญญาณสัญญาณ' ปกติ ฉันคิดว่ามันจะมีประโยชน์ถ้าใครลงเอยที่นี่จาก d6 มันผิดใช่ไหม ฉันดูเหมือนจะถูกทำเครื่องหมายสำหรับมัน
munkiepus

เพิ่งอัพเดตเพื่อลบ run cron ออกจากส่วนบรรทัดคำสั่งเพิ่งพบว่ามันอาจทำให้เกิดปัญหา
munkiepus

-1

คุณสามารถดีบักได้โดยใช้ xdebug, รัน cron จากส่วนต่อประสานผู้ดูแลระบบ Admin> การตั้งค่า> ระบบ> cron

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.