Cron parou de correr; os logs dizem: “Tentativa de executar novamente o cron enquanto ele já estiver em execução.”

11

Quais são as etapas para solucionar e resolver esse problema de acordo com o título?

Quando tento executar manualmente, recebo uma página imediatamente e a mensagem de erro "Tentando executar novamente o cron enquanto ele já está em execução".

giorgio79
fonte
Eu não conseguia lembrar de cima o que no db cron olha, mas um rápido google de "tentando executar o cron enquanto ele já está em execução" me indicou digitaledgesw.com/node/21 , talvez aplicar a D7
Jimajamma
Isso é muito estranho. Essa mensagem é encontrada exatamente uma vez no código do core, logo após uma verificação nessa variável (via lock_acquire em drupal_cron_run). Se você postar mais informações / sintomas que apontam que é realmente diferente, eu a reabrirei.
mpdonadio
Sugestão: você pode tentar instalar um Drupal novo e configurar o cron para executar a cada 3 minutos e ver se você tem o mesmo efeito !!!
Aboodred1
Apenas execute:drush sqlq "DELETE FROM semaphore WHERE name = 'cron';"
kenorb
4
PARA FUTUROS LEITORES: A resposta atualmente aceita não está correta para o Drupal 7, a versão do Drupal para a qual a pergunta é. É válido para o Drupal 6, mas o código do Drupal 7 foi alterado; acontece que o Drupal 7 tem restos do Drupal 6 que não foram limpos.
kiamlaluno

Respostas:

12

O semáforo cron provavelmente está bloqueado. Você pode tentar chamar drupal_cron_cleanup () de qualquer lugar do seu código (que não é invocado pelo cron) e que deve desbloquear sua variável de semáforo cron.

Se você tiver o drush configurado no Drupal 6, também poderá tentar:

$ drush vdel -y cron_semaphore
barista amador
fonte
3
Ou exclua-o manualmente da tabela de variáveis ​​se você tiver acesso ao banco de dados em vez de drush.
Malks
8
Não esqueça que esses valores estão armazenados em cache na tabela cache_bootstrap.
tostinni
1
por favor, qual é o nome exato da mesa, porque eu não encontrar qualquer cron_semaphore na tabela de variáveis
Mohammed amina Bourkadi
2
Quando executo o comando drush acima, recebo "cron_semaphore não encontrado". Alguma ideia?
Nigel Waters
1
@NigelWaters O semáforo cron tornou-se um cadeado, no Drupal 7, mas drupal_cron_cleanup()parece não estar atualizado.
kiamlaluno
19

Sumário

A mensagem de erro que você está vendo aconteceria se as duas condições a seguir fossem atendidas:

  • Os trabalhos do cron não são concluídos (erro) ou levam mais de 4 minutos para serem finalizados;
  • Você invoca o cron com mais frequência a cada 4 minutos (de acordo com a configuração do crontab, não a do Drupal)

Esta mensagem de erro é, portanto, um sintoma de uma tarefa cron que está falhando ou está demorando muito para ser executada. (Nota: eu sei que você já encontrou o culpado, mas eu queria adicionar uma resposta para as pessoas que encontrarem esta página por meio de pesquisas, como eu).

fundo

A primeira coisa a entender é como as tarefas do cron do Drupal são executadas. O cron Drupal é chamado em intervalos regulares - por meio de um trabalho cron no seu servidor ou após o carregamento de cada página, se você usar o cron do pobre, que é o padrão do Drupal.

As tarefas cron não são necessariamente executadas sempre que o cron é chamado - há uma configuração no Drupal (o padrão é 3 horas) que diz com que frequência as tarefas cron devem ser executadas. Mas esse atraso de 3 horas se aplica apenas se as tarefas cron tiverem sido concluídas com êxito.

No Drupal 7, o cron usa os mecanismos de bloqueio do Drupal , que fornecem um sistema de bloqueio consultivo e cooperativo. Um dos recursos desse sistema de bloqueio é que os bloqueios expiram após um certo tempo. No caso do cron, ele expira após 4 minutos - portanto, se o seu cron for chamado a cada 3 minutos e o trabalho anterior do cron não tiver terminado até esse momento (ele travou ou estava muito lento), você realmente receberia essa mensagem de erro .

O fato de você definir o cron para cada 12 horas não faz diferença - porque a tarefa cron do Drupal está falhando / demorando muito tempo, o Drupal assume que não foi executado e, portanto, tenta executá-lo novamente assim que o cron for invocado. O atraso de doze horas se aplica apenas a execuções cron bem-sucedidas.

A variável cron semáforo não existe mais no Drupal 7 - era para uma versão mais antiga do Drupal. No Drupal 7, não há uma maneira confiável de liberar manualmente um bloqueio, porque o backend de bloqueio pode mudar - no entanto, se você estiver usando o mecanismo de bloqueio principal, poderá liberar os bloqueios cron editando o banco de dados:

DELETE FROM semaphore WHERE name = 'cron';

Mas, ao fazer isso, você só conserta os sintomas - o problema que precisa ser resolvido é o motivo pelo qual o cron está falhando / demorando tanto para ser executado.

Alice Heaton
fonte
Estou recebendo esta mensagem, mas, quando executo cron_debug, todos os trabalhos cron terminam com êxito e são executados rapidamente (exceto para atualizações principais que levam ~ 5 segundos). Se a origem desse problema é lenta ou falha nas rotinas cron, por que o cron_debug não as destacaria?
Duvida1
1
Não sei como o módulo cron_debug funciona, então não posso comentar sobre isso. Qual é o valor da variável 'cron_safe_threshold'? Quais dados são a tabela 'semáforo'?
Alice Heaton
1
Esta é a resposta correta para o Drupal 7. +1 para a explicação detalhada.
kiamlaluno
BTW, se o cron estiver falhando, use os módulos Cron Debug para ver em qual módulo ele desliga - 9 vezes em 10 é o módulo Search. Tente desligar o módulo de pesquisa, execute o cron manualmente e veja o que acontece. Para encontrar os nós que está tentando índice: drupal.stackexchange.com/questions/22825/...
Dan Mantyla
4

A cron_semaphorevariável existia no Drupal 6, mas você está usando o Drupal 7, portanto os bloqueios de semáforo foram movidos para uma tabela separada chamada semaphore.

Portanto, a solução para desbloquear o semáforo cron seria:

Drupal 7

drush sqlq "TRUNCATE semaphore"

Drupal 6

drush -y vdel cron_semaphore 
kenorb
fonte
3
Variante "Menos extrema" para Drupal 7:drush sql-query "DELETE FROM semaphore WHERE name='cron'"
tanius
2

Você pode depurar o cron usando o módulo Cron Debug .

O Cron Debug ajudará você a encontrar processos cron que

  • falha devido a erros de programação ou tempo de execução
  • tempo limite (PHP, servidor, banco de dados)
  • são muito lentos

O Cron Debug também permitirá que você teste as funções cron específicas, enquanto não executa outras. Isso pode ser bom para o desenvolvimento de funções cron, nas quais você não deseja executar um cron.php completo com toda manutenção, alertas e outras tarefas toda vez que testar sua própria função.

Nishant
fonte
1
Este módulo foi um salva-vidas para mim!
Dan Mantyla
Sim, este módulo é bom, ajuda a depurar o trabalho cron.
Nishant
1

Foi assim que resolvi o problema do cron:

  1. Via PhpMyAdmin, procurei na tabela de semáforo e apaguei a linha em que name = cron
  2. Eu executei "drush cron" via linha de comando
  3. Vi uma mensagem de erro que me deu uma pista do problema; isso pode ser diferente para você, mas para mim, um módulo desinstalado recentemente que estava compartilhando uma biblioteca PHP com um módulo instalado estava causando um erro
Albertski
fonte
0

Para o Drupal 8: drush sqlq "DELETE FROM semáforo WHERE name = 'cron';"

Diana
fonte
0

No Drupal 7, como ainda outra opção,

Via drush croneu estava recebendo,

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

Isso estava no ambiente de desenvolvimento e aconteceu porque um cron anterior estava sendo executado e foi interrompido.

Na includes/common.inclinha 5413 ou próximo, você encontrará este bloco, 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);
  }

Modifique o ifcom um && 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 execute novamente o cron. Isso permitirá que ele funcione.

Por favor, não implante isso e reverta-o novamente depois que terminar. Também ajuda na depuração.

rovr138
fonte
-1

Eu já enfrentei isso algumas vezes. No Drupal 6, se você não usar o drush, poderá corrigi-lo assim:

1 Remova as variáveis ​​cron_% da tabela de variáveis.

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

DELETE FROM variable WHERE name like "cron%";

2 limpe o cache do Drupal em: / admin / settings / performance

pressionando o botão 'limpar dados em cache' na parte inferior da página.

3 execute cron no painel de administração / admin / reports / status / run-cron não execute na linha de comando, pois isso pode causar problemas.

4 Verifique se a próxima execução automática do cron é concluída normalmente.

munkiepus
fonte
Bem-vindo ao Drupal Answers! A questão é sobre o Drupal 7. A exclusão de linhas dessa tabela do banco de dados não teria muito efeito.
kiamlaluno
Ah, eu apenas adicionei a resposta, pois não havia dito especificamente que era para o Drupal 7 no OP. Isso funciona bem para o drupal 6 e é mais completo que as respostas usuais de 'excluir o semáforo'. Eu achei que seria útil se alguém acabasse aqui do d6. Isso estava errado? Eu pareço ter sido marcado por isso.
Munkiepus 9/09/14
acaba de atualizar para remover o cron prazo da parte de linha de comando, só descobri que pode causar problemas
munkiepus
-1

Você pode depurar usando xdebug, execute cron a partir da interface administrativa Admin> Configuração> sistema> cron.

Abdulla Abu Zakham
fonte