Cron berhenti berlari; log mengatakan: "Mencoba untuk menjalankan kembali cron ketika sedang berjalan."

11

Apa langkah-langkah untuk memecahkan masalah dan menyelesaikan masalah ini sesuai judul?

Ketika saya mencoba untuk menjalankan secara manual, saya mendapatkan halaman segera, dan pesan kesalahan "Mencoba untuk menjalankan kembali cron ketika sedang berjalan."

giorgio79
sumber
Saya tidak dapat mengingat dari atas kepala saya apa yang ada di db cron lihat, tetapi google cepat "berusaha untuk menjalankan kembali cron saat sudah berjalan" menunjuk saya ke digitaledgesw.com/node/21 , itu mungkin berlaku untuk D7
Jimajamma
Itu sangat aneh. Pesan itu ditemukan tepat sekali dalam kode untuk inti, tepat setelah pemeriksaan ke variabel itu (via lock_acquire di drupal_cron_run). Jika Anda memposting lebih banyak info / gejala yang menunjukkan bahwa memang berbeda, saya akan membukanya kembali.
mpdonadio
Saran: dapatkah Anda mencoba menginstal Drupal baru dan mengatur cron untuk berjalan setiap 3 menit dan melihat apakah Anda memiliki efek yang sama !!!
Aboodred1
Jalankan saja:drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"
kenorb
4
UNTUK PEMBACA MASA DEPAN: Jawaban yang diterima saat ini tidak benar untuk Drupal 7, versi Drupal yang menjadi pertanyaannya. Ini berlaku untuk Drupal 6, tetapi kode Drupal 7 berubah; Kebetulan Drupal 7 tetap dari Drupal 6 yang belum dibersihkan.
kiamlaluno

Jawaban:

12

Cron semaphore mungkin terkunci. Anda dapat mencoba memanggil drupal_cron_cleanup () dari mana saja dalam kode Anda (itu tidak akan dipanggil oleh cron) dan itu akan membuka kunci variabel semaphore cron Anda.

Jika Anda telah mengkonfigurasi drush di Drupal 6, Anda juga dapat mencoba:

$ drush vdel -y cron_semaphore
barista amatir
sumber
3
Atau hapus secara manual dari tabel variabel jika Anda memiliki akses db daripada drush.
Malks
8
Jangan lupa nilai-nilai ini di-cache dalam tabel cache_bootstrap.
tostinni
1
tolong apa nama sebenarnya dari tabel karena saya tidak menemukan cron_semaphore di tabel variabel
mohammed amine bourkadi
2
Ketika saya menjalankan perintah drush di atas saya mendapatkan "cron_semaphore tidak ditemukan." Ada ide?
Nigel Waters
1
@NigelWaters Cron semaphore menjadi kunci, di Drupal 7, tetapi drupal_cron_cleanup()tampaknya tidak diperbarui.
kiamlaluno
19

Ringkasan

Pesan kesalahan yang Anda lihat akan terjadi jika dua kondisi berikut terpenuhi:

  • Pekerjaan cron Anda tidak selesai (kesalahan) atau butuh lebih dari 4 menit untuk menyelesaikan;
  • Anda memanggil cron lebih sering daripada setiap 4 menit (Menurut pengaturan crontab Anda, bukan pengaturan di Drupal)

Pesan kesalahan ini karena itu merupakan gejala tugas cron yang gagal atau terlalu lama untuk dijalankan. (Catatan: Saya sadar Anda telah menemukan pelakunya, tetapi saya ingin menambahkan jawaban untuk orang yang menemukan halaman ini melalui pencarian, seperti yang saya lakukan)

Latar Belakang

Hal pertama yang harus dipahami adalah bagaimana tugas cron Drupal dijalankan. Cron Drupal dipanggil secara berkala - baik melalui cron job di server Anda, atau setelah setiap halaman dimuat jika Anda menggunakan cron orang miskin yang merupakan default Drupal.

Tugas cron tidak harus dijalankan setiap kali cron dipanggil - ada pengaturan di Drupal (standarnya adalah 3 jam) yang mengatakan seberapa sering tugas cron harus dijalankan. Tetapi keterlambatan 3 jam ini hanya berlaku jika tugas cron telah selesai dengan sukses.

Dalam Drupal 7, cron menggunakan mekanisme penguncian Drupal , yang menyediakan sistem kunci kerja sama, penasehat. Salah satu fitur dari sistem kunci ini adalah bahwa kunci akan kedaluwarsa setelah waktu tertentu. Dalam kasus cron, kadaluwarsa setelah 4 menit - jadi jika cron Anda dipanggil setiap 3 menit dan pekerjaan cron sebelumnya belum selesai pada saat itu (entah crash atau sangat lambat), Anda memang akan mendapatkan pesan kesalahan ini .

Fakta bahwa Anda mengatur cron menjadi setiap 12 jam tidak membuat perbedaan - karena tugas cron Drupal gagal / terlalu lama, Drupal menganggap itu belum dijalankan, jadi coba jalankan lagi segera setelah cron dipanggil. Penundaan dua belas jam hanya berlaku untuk cron run yang berhasil.

Variabel cron semaphore tidak ada lagi di Drupal 7 - ini untuk versi Drupal yang lebih lama. Di Drupal 7 tidak ada cara yang dapat diandalkan untuk melepaskan kunci secara manual, karena backend penguncian dapat berubah - namun jika Anda menggunakan mekanisme penguncian inti maka Anda dapat melepaskan kunci cron dengan mengedit database:

DELETE FROM semaphore WHERE name = 'cron';

Tetapi dengan melakukan ini Anda hanya akan memperbaiki gejalanya - masalah yang perlu diatasi adalah mengapa cron gagal / butuh waktu lama untuk dijalankan.

Alice Heaton
sumber
Saya mendapatkan pesan ini, tetapi ketika saya menjalankan cron_debug semua pekerjaan cron berakhir dengan sukses dan berjalan dengan cepat (kecuali untuk pembaruan inti yang memakan waktu ~ 5 detik). Jika sumber masalah ini lambat atau gagal dengan rutin cron, mengapa cron_debug tidak menyorotnya?
doub1ejack
1
Saya tidak tahu bagaimana modul cron_debug bekerja, jadi saya tidak bisa mengomentari ini. Berapa nilai variabel 'cron_safe_threshold'? Data apa tabel 'semaphore'?
Alice Heaton
1
Ini adalah jawaban yang benar untuk Drupal 7. +1 untuk penjelasan terperinci.
kiamlaluno
BTW, jika cron gagal untuk Anda, gunakan modul Cron Debug untuk melihat modul yang digunakannya - 9 kali dari 10 modul Cari. Coba matikan modul pencarian kemudian jalankan cron secara manual dan lihat apa yang terjadi. Untuk menemukan node yang coba diindeks: drupal.stackexchange.com/questions/22825/…
Dan Mantyla
4

The cron_semaphorevariabel lakukan ada pada Drupal 6, tapi Anda menggunakan Drupal 7, sehingga kunci semaphore pindah ke meja terpisah yang disebut semaphore.

Jadi solusi untuk membuka kunci cron semaphore adalah:

Drupal 7

drush sqlq "TRUNCATE semaphore"

Drupal 6

drush -y vdel cron_semaphore 
kenorb
sumber
3
Varian "Kurang ekstrim" untuk Drupal 7:drush sql-query "DELETE FROM semaphore WHERE name='cron'"
tanius
2

Anda dapat men-debug cron dengan menggunakan modul Cron Debug .

Cron Debug akan membantu Anda menemukan proses cron yang mana

  • gagal karena kesalahan pemrograman atau runtime
  • waktu habis (PHP, server, database)
  • sangat lambat

Cron Debug juga akan memungkinkan Anda untuk menguji menjalankan fungsi cron tertentu sementara tidak menjalankan yang lain. Ini bagus untuk mengembangkan fungsi cron di mana Anda tidak ingin menjalankan cron.php lengkap dengan semua perawatan, peringatan, dan tugas-tugas lain setiap kali Anda menguji fungsi Anda sendiri.

Nishant
sumber
1
Modul ini adalah penyelamat bagi saya!
Dan Mantyla
ya, modul ini bagus, ada baiknya untuk men-debug pekerjaan cron.
Nishant
1

Inilah cara saya memecahkan masalah cron:

  1. Melalui PhpMyAdmin, saya melihat tabel semaphore dan menghapus baris di mana name = cron
  2. Saya menjalankan "drush cron" melalui baris perintah
  3. Saya melihat pesan kesalahan yang memberi saya petunjuk tentang masalah ini; ini mungkin berbeda untuk Anda, tetapi bagi saya modul yang baru saja dihapus yang membagikan perpustakaan PHP dengan modul yang diinstal menyebabkan kesalahan
albertski
sumber
0

Untuk Drupal 8: drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"

Diana
sumber
0

Pada Drupal 7, bahkan sebagai opsi lain,

Melalui drush cronsaya mendapatkan,

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

Ini pada lingkungan pengembangan dan terjadi karena cron sebelumnya berjalan dan terganggu.

Pada includes/common.inc, pada baris 5413, atau sekitar, Anda akan menemukan blok ini, 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);
  }

Ubah ifdengan && 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);
  }

Dan jalankan kembali cron. Itu akan memungkinkannya berjalan.

Tolong jangan menyebarkan ini dan mengembalikannya kembali setelah selesai. Ini juga membantu dengan debugging.

rovr138
sumber
-1

Saya telah menghadapi ini beberapa kali. Di Drupal 6 Jika Anda tidak menggunakan drush, Anda dapat memperbaikinya seperti ini:

1 Hapus variabel cron_% dari tabel variabel.

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

DELETE FROM variable WHERE name like "cron%";

2 kosongkan cache Drupal di: / admin / setting / performance

dengan menekan tombol 'hapus data cache' di bagian bawah halaman.

3 jalankan cron dari panel admin / admin / laporan / status / run-cron jangan jalankan dari baris perintah karena ini dapat menyebabkan masalah.

4 Periksa apakah menjalankan cron otomatis berikutnya selesai seperti biasa.

munkiepus
sumber
Selamat Datang di Jawaban Drupal! Pertanyaannya adalah tentang Drupal 7. Menghapus baris dari tabel database tidak akan banyak berpengaruh.
kiamlaluno
Ah saya hanya menambahkan jawaban karena tidak mengatakan secara spesifik bahwa itu untuk Drupal 7 di OP. Itu bekerja dengan baik untuk drupal 6, dan lebih lengkap daripada jawaban 'delete the semaphore' yang biasa. saya pikir itu akan sangat membantu jika ada yang berakhir di sini dari d6. Apakah itu salah? Saya tampaknya telah ditandai untuk itu.
munkiepus
baru saja diperbarui untuk menghapus run cron dari bagian baris perintah, baru tahu itu dapat menyebabkan masalah
munkiepus
-1

Anda dapat men-debug dengan menggunakan xdebug, menjalankan cron dari antarmuka admin Admin> Configuration> system> cron.

Abdulla Abu Zakham
sumber