ขั้นตอนในการแก้ไขปัญหาและแก้ไขปัญหานี้ตามชื่อเรื่องคืออะไร
เมื่อฉันพยายามเรียกใช้ด้วยตนเองฉันจะได้รับหน้าทันทีและข้อความแสดงข้อผิดพลาด "พยายามเรียกใช้ cron อีกครั้งในขณะที่ทำงานอยู่"
drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"
ขั้นตอนในการแก้ไขปัญหาและแก้ไขปัญหานี้ตามชื่อเรื่องคืออะไร
เมื่อฉันพยายามเรียกใช้ด้วยตนเองฉันจะได้รับหน้าทันทีและข้อความแสดงข้อผิดพลาด "พยายามเรียกใช้ cron อีกครั้งในขณะที่ทำงานอยู่"
drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"
คำตอบ:
สัญญาณ cron อาจถูกล็อค คุณสามารถลองโทรdrupal_cron_cleanup ()จากที่ใดก็ได้ในรหัสของคุณ (ซึ่งไม่ได้เกิดจาก cron เรียก) และควรปลดล็อคตัวแปรสัญญาณ cron ของคุณ
หากคุณตั้งค่า Drush ใน Drupal 6 คุณสามารถลอง:
$ drush vdel -y cron_semaphore
cache_bootstrap
อย่าลืมค่าเหล่านี้จะถูกเก็บไว้ในตาราง
drupal_cron_cleanup()
ดูเหมือนว่าจะไม่ได้รับการปรับปรุง
ข้อความแสดงข้อผิดพลาดที่คุณเห็นจะเกิดขึ้นหากตรงตามเงื่อนไขสองข้อต่อไปนี้:
ข้อความแสดงข้อผิดพลาดนี้จึงเป็นอาการของงาน 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_semaphore
ตัวแปรได้อยู่ใน Drupal 6 แต่คุณกำลังใช้ Drupal 7 semaphore
เพื่อล็อคสัญญาณย้ายเข้าไปอยู่ในตารางแยกต่างหากที่เรียกว่า
ดังนั้นวิธีการปลดล็อคสัญญาณ cron จะเป็น:
Drupal 7
drush sqlq "TRUNCATE semaphore"
Drupal 6
drush -y vdel cron_semaphore
drush sql-query "DELETE FROM semaphore WHERE name='cron'"
คุณสามารถดีบัก cron ได้โดยใช้โมดูลCron Debug
Cron Debug จะช่วยคุณค้นหากระบวนการ cron ที่
- ล้มเหลวเนื่องจากข้อผิดพลาดในการเขียนโปรแกรมหรือรันไทม์
- หมดเวลา (PHP, เซิร์ฟเวอร์, ฐานข้อมูล)
- ช้ามาก
Cron Debug จะช่วยให้คุณทดสอบการใช้งานฟังก์ชั่น cron เฉพาะในขณะที่ไม่ใช้งานฟังก์ชั่นอื่น ๆ นี่เป็นสิ่งที่ดีสำหรับการพัฒนาฟังก์ชั่น cron ที่คุณไม่ต้องการเรียกใช้ cron.php เต็มรูปแบบด้วยการบำรุงรักษาการแจ้งเตือนและงานอื่น ๆ ทุกครั้งที่คุณทดสอบฟังก์ชั่นของคุณเอง
นี่คือวิธีที่ฉันแก้ไขปัญหา cron:
name = cron
สำหรับ Drupal 8: drush sqlq "ลบจากเซมาฟอร์ WHERE name = 'cron';"
ใน 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 ที่จะยอมให้มันวิ่ง
โปรดอย่าปรับใช้สิ่งนี้และเปลี่ยนกลับเป็นหลังจากเสร็จสิ้น นอกจากนี้ยังช่วยในการแก้ไขข้อบกพร่อง
ฉันมากับเรื่องนี้สองสามครั้ง ใน 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 อัตโนมัติครั้งต่อไปเสร็จสมบูรณ์ตามปกติ
คุณสามารถดีบักได้โดยใช้ xdebug, รัน cron จากส่วนต่อประสานผู้ดูแลระบบ Admin> การตั้งค่า> ระบบ> cron