Cron ha smesso di funzionare; i log dicono: "Tentativo di rieseguire cron mentre è già in esecuzione."


11

Quali sono i passaggi per risolvere e risolvere questo problema secondo il titolo?

Quando provo a eseguire manualmente, ottengo immediatamente una pagina e viene visualizzato il messaggio di errore "Tentativo di rieseguire cron mentre è già in esecuzione".


Non riuscivo a ricordare dalla parte superiore della mia testa ciò che nel db cron guarda, ma un rapido google di "tentare di rieseguire cron mentre è già in esecuzione" mi ha indicato digitaledgesw.com/node/21 , potrebbe applicare a D7
Jimajamma il

È molto strano. Quel messaggio viene trovato esattamente una volta nel codice per core, subito dopo un controllo su quella variabile (tramite lock_acquire in drupal_cron_run). Se pubblichi più informazioni / sintomi che indicano che è davvero diverso, lo riaprirò.
mpdonadio

Suggerimento: puoi provare a installare un nuovo Drupal e impostare cron per eseguire ogni 3 minuti e vedere se hai lo stesso effetto !!!
Aboodred1

drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"
Corri

4
AI LETTORI FUTURI: la risposta attualmente accettata non è corretta per Drupal 7, la versione di Drupal per cui è la domanda. È valido per Drupal 6, ma il codice Drupal 7 è cambiato; succede solo che Drupal 7 ha resti di Drupal 6 che non sono stati ripuliti.
kiamlaluno

Risposte:


12

Il semaforo cron è probabilmente bloccato. Potresti provare a chiamare drupal_cron_cleanup () da qualsiasi parte del tuo codice (che non è invocato da cron) e che dovrebbe sbloccare la tua variabile semaforo cron.

Se hai configurato Drush in Drupal 6 puoi anche provare:

$ drush vdel -y cron_semaphore

3
Oppure eliminalo manualmente dalla tabella delle variabili se hai accesso a db anziché drush.
Malks,

8
Non dimenticare che questi valori sono memorizzati nella tabella cache_bootstrap.
tostinni,

1
per favore qual è il nome esatto della tabella perché non ho trovato cron_semaphore nella tabella delle variabili
mohammed amine bourkadi

2
Quando eseguo il comando drush sopra ottengo "cron_semaphore non trovato." Qualche idea?
Nigel Waters,

1
@NigelWaters Il semaforo cron è diventato un blocco, in Drupal 7, ma drupal_cron_cleanup()sembra non essere aggiornato.
kiamlaluno

19

Sommario

Il messaggio di errore che visualizzerai si verificherebbe se si verificano le due seguenti condizioni:

  • I lavori cron non terminano (errore) o impiegano più di 4 minuti per terminare;
  • Richiami cron più spesso di ogni 4 minuti (in base all'impostazione crontab, non all'impostazione in Drupal)

Questo messaggio di errore è quindi un sintomo di attività cron che non riescono o richiedono troppo tempo per essere eseguite. (Nota: mi rendo conto che hai già trovato il colpevole, ma volevo aggiungere una risposta per le persone che trovano questa pagina tramite le ricerche, come ho fatto io)

sfondo

La prima cosa da capire è come vengono eseguite le attività cron di Drupal. Il cron di Drupal viene invocato a intervalli regolari - tramite un processo cron sul server o dopo ogni caricamento della pagina se si utilizza il cron del povero che è l'impostazione predefinita di Drupal.

Tuttavia, le attività cron non vengono necessariamente eseguite ogni volta che viene richiamato cron: in Drupal è presente un'impostazione (l'impostazione predefinita è 3 ore) che indica la frequenza con cui eseguire le attività cron. Ma questo ritardo di 3 ore si applica solo se le attività cron sono state completate correttamente.

In Drupal 7, cron utilizza i meccanismi di blocco di Drupal , che fornisce un sistema di blocco cooperativo e consultivo. Una delle caratteristiche di questo sistema di blocco è che i blocchi scadono dopo un certo tempo. Nel caso di cron, scade dopo 4 minuti - quindi se il tuo cron viene invocato ogni 3 minuti e il precedente processo cron non era terminato in quel momento (o si è bloccato o era molto lento), otterrai effettivamente questo messaggio di errore .

Il fatto che imposti cron per essere ogni 12 ore non fa differenza - poiché l'attività cron di Drupal non riesce / impiega troppo tempo, Drupal presume che non sia stato eseguito, quindi prova a eseguirlo di nuovo non appena viene richiamato cron. Il ritardo di dodici ore si applica solo a cron run riuscite.

La variabile semaforo cron non esiste più in Drupal 7 - questo era per una versione precedente di Drupal. In Drupal 7 non esiste un modo affidabile per rilasciare manualmente un blocco, perché il backend del blocco potrebbe cambiare - tuttavia se si utilizza il meccanismo di blocco del nucleo, è possibile rilasciare i blocchi cron modificando il database:

DELETE FROM semaphore WHERE name = 'cron';

Ma così facendo risolveresti solo i sintomi: il problema che deve essere risolto è il motivo per cui cron non riesce / impiega così tanto tempo per funzionare.


Ricevo questo messaggio, ma quando eseguo cron_debug tutti i lavori cron terminano correttamente e si eseguono rapidamente (ad eccezione degli aggiornamenti di base che richiedono ~ 5 secondi). Se l'origine di questo problema è la cronologia lenta o non riuscita, perché cron_debug non li evidenzia?
doub1ejack,

1
Non so come funzioni il modulo cron_debug, quindi non posso commentarlo. Qual è il valore della variabile 'cron_safe_threshold'? Quali dati è la tabella 'semaforo'?
Alice Heaton,

1
Questa è la risposta corretta per Drupal 7. +1 per la spiegazione dettagliata.
kiamlaluno

A proposito, se cron non funziona per te, usa i moduli Cron Debug per vedere su quale modulo si blocca - 9 volte su 10 è il modulo di ricerca. Prova a disattivare il modulo di ricerca, quindi esegui cron manualmente e vedi cosa succede. Per trovare i nodi che sta cercando di indicizzare: drupal.stackexchange.com/questions/22825/…
Dan Mantyla

4

La cron_semaphorevariabile esisteva in Drupal 6, ma stai usando Drupal 7, quindi i blocchi dei semafori sono stati spostati in una tabella separata chiamata semaphore.

Quindi la soluzione per sbloccare il semaforo cron sarebbe:

Drupal 7

drush sqlq "TRUNCATE semaphore"

Drupal 6

drush -y vdel cron_semaphore 

3
Variante "Meno estrema" per Drupal 7:drush sql-query "DELETE FROM semaphore WHERE name='cron'"
tanius

2

È possibile eseguire il debug del cron utilizzando il modulo Cron Debug .

Cron Debug ti aiuterà a trovare i processi cron che

  • fallire a causa di errori di programmazione o di runtime
  • timeout (PHP, server, database)
  • sono molto lenti

Cron Debug ti permetterà anche di testare specifiche funzioni cron mentre non ne esegui altre. Questo può essere utile per lo sviluppo di funzioni cron in cui non si desidera eseguire un cron.php completo con tutta la manutenzione, gli avvisi e altre attività ogni volta che si verifica la propria funzione.


1
Questo modulo mi ha salvato la vita!
Dan Mantyla,

Sì, questo modulo è buono, aiuta a eseguire il debug del cron job.
Nishant,

1

Ecco come ho risolto il problema cron:

  1. Tramite PhpMyAdmin, ho cercato nella tabella dei semafori e ho eliminato la riga in cui name = cron
  2. Ho eseguito "drush cron" tramite riga di comando
  3. Ho visto un messaggio di errore che mi ha dato un indizio del problema; questo potrebbe essere diverso per te, ma per me un modulo disinstallato di recente che condivideva una libreria PHP con un modulo installato stava causando un errore

0

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


0

Su Drupal 7, come anche un'altra opzione,

Via drush cronstavo ottenendo,

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

Questo era in ambiente di sviluppo ed è accaduto perché un cron precedente era in esecuzione e si è interrotto.

Su includes/common.inc, alla riga 5413 o intorno, troverai questo blocco, 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);
  }

Modifica il ifcon un && 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);
  }

E rieseguire cron. Ciò gli consentirà di funzionare.

Non distribuire questo e ripristinarlo al termine. Aiuta anche con il debug.


-1

Mi sono imbattuto in questo alcune volte. In Drupal 6 Se non usi drush puoi risolverlo in questo modo:

1 Rimuovere le variabili cron_% dalla tabella delle variabili.

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

DELETE FROM variable WHERE name like "cron%";

2 cancella la cache di Drupal su: / admin / settings / performance

premendo il pulsante "cancella dati memorizzati nella cache" nella parte inferiore della pagina.

3 esegui cron dal pannello di amministrazione / admin / reports / status / run-cron non eseguirlo dalla riga di comando in quanto ciò può causare problemi.

4 Verificare che la successiva esecuzione cron automatica venga completata normalmente.


Benvenuto in Drupal Answers! La domanda riguarda Drupal 7. L'eliminazione di righe da quella tabella del database non avrebbe molto effetto.
kiamlaluno

Ah, ho aggiunto solo la risposta poiché non aveva detto specificamente che era per Drupal 7 nell'OP. Funziona bene con drupal 6 ed è più completo delle solite risposte "elimina il semaforo". ho pensato che sarebbe stato utile se qualcuno fosse finito qui da d6. È stato sbagliato? Mi sembra che sia stato segnato per questo.
Munkiepus,

appena aggiornato per rimuovere il cron di esecuzione dalla parte della riga di comando, appena scoperto che può causare problemi
munkiepus

-1

Puoi eseguire il debug utilizzando xdebug, esegui cron dall'interfaccia di amministrazione Admin> Configurazione> sistema> cron.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.