Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ppy

CronTab do Cpanel - falha de vez em quando?

Recommended Posts

Olá pessoal

 

Vou tentar ser bem detalhado mas se faltar alguma informação eu informo:

 

Crontab no cpanel funcionando perfeitamente a mais de 2 meses com execução de 1 em 1 minuto, de repente não executa (morreu por 1 minuto), não iniciado no determinado minuto.

 

Depois sem mais nem menos volta a funcionar.

 

- Não há logs de erros no php (nas pastas do scripts)bem como não há um grande uso do server dedicado no momento da falha.

- Carga do server que poderia causar a demora na exec esta como antes, mesmo nivel, nem + nem -.

- Não há erro no script ou erro informado no log php que fica na pasta do script.

- No script tenho um verificador, envia a base de dados a hora/mim/segundos que o arquivo foi iniciado:

--hoje as 09:01:00 não foi chamado, porém as 09:00 e as 09:02 foi normal e as 09:37 também não foi chamado

 

Dentro de 2 meses somente hoje ocorreu isto e acabou comigo.

 

Veja como eu chamo o script php no cron:

De 1 em 1 minuto (* * * * *)

 

/usr/bin/php -f /home/meusitexxxxx/public_html/xxxx/xxx.php - não chamo pelo links --dump www.....

ou seja mesmo que caia o link o servidor irá executar o script

 

Detalhes do servidor:

Dedicado Dell x86_64 linux

maior q 2.0mhz

4gb memória (pico de 40% de uso da memória há 10 dias atráz)

php 5.2.11

apache 2.2.14

cpanel pro 1.0 (RC1)

cpanel ver 11.25.0-STABLE

2 hd scsi utilizado apenas 20% e outro backup

mysql 5.0.90

 

O que tem no script:

 

um While com 60 chamadas e sleep de 1 em 1 segundo, ou seja o cron chama o script, este script fica vivo por 60 segundos executando os comando (60 vezes) e termina. Quando termina o cron chama de novo.

 

Neste while consultas do BD e caso se encaixe no que queremos ele grava no BD e atualiza o BD.

 

 

O Fantasma

Por que é que o crontab não executou a chamada do script neste tempo??

Compartilhar este post


Link para o post
Compartilhar em outros sites

é mais fácil postar o script, ou parte dele, pois, pelo que entendi, seu script é um grande loop que nunca pára. Assim, o cron vai chamando os scripts infinitamente e sobrepondo os processos. Isso, tecnicamente, sobrecarregará o servidor.

 

onde o sleep entra nessa história também não entendi

Compartilhar este post


Link para o post
Compartilhar em outros sites

<?php
set_time_limit(0);
ignore_user_abort(false);
include("db.xinc.php");
include("xxfunc.php");
$db100=new db;
$db100->open();
mysql_query("SET NAMES 'ISO-8859-1'");



$i=1;
while($i < 61)
{
droga($taxa_ra);
sleep(1);
$i++;
}

function droga($taxa)
{
if($ativado==1)
{
mysql_query("insert");
}else{
mysql_query("update")or die(mysql_error());
}
}// FIM ROB NORMAL
?>

 

Resumi bastante o script, pois todo o conteudo a muitas checagens se é positivo ou falso, mas o que ele realmente faz é isso daí.

 

Crontab chama o script acima de 1 em 1 minuto

e a todo o minuto este script acaba pois o while é até 60 vezes o que dá 60 segundos visto que o sleep é feito para que o script haja de 1 em 1 segundo.

 

Eu acredito que talvez nã seja o script pos ele tava funcionando muito bem e agora ta normal. o meu medo é dar pane de volta pois aconteceu 2x no mes e mais uma dessa eu to fu..

 

Grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

você precisa desse sleep()?

 

Não sei se o crontab possui alguma regra de verificação de programas em execução, mas pode ocorrer o seguinte: se o script demorar mais de um minuto (alguma inserção ou verificão demorou mais que o normal), o cron vê que já existe um processo igual e não executa o que deveria executar.

 

vocÊ realmente precisa desse scritp rodando por um minuto? Se ele já roda a cada minuto pelo cron, não importa se ele será executado em 0.5 segundo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

você precisa desse sleep()?

 

Não sei se o crontab possui alguma regra de verificação de programas em execução, mas pode ocorrer o seguinte: se o script demorar mais de um minuto (alguma inserção ou verificão demorou mais que o normal), o cron vê que já existe um processo igual e não executa o que deveria executar.

 

vocÊ realmente precisa desse scritp rodando por um minuto? Se ele já roda a cada minuto pelo cron, não importa se ele será executado em 0.5 segundo.

 

Preciso que seja de 1 em 1 segundo e para a vida toda. Ele checa mudanças em um tabela e estes dados tem que ser atualizados de segundo em segundo.

 

Poderia até ser de 0.5seg, mas seriam muitas consulta o que dobraria pela média atual.

 

Até pensei em colocar um while infinito e esquecer o crontab, mas o problema é parar o script depois.

Uma vez eu fiz isto com while infinito e correu tudo bem por um mes, mas depois eu tive que atualizar o script e quem disse que dava. Só reiniciando o server no data center, pois era infinito mesmo. Não tenho acesso direto ao server, foi por isso.

 

Agora você falando que se o processo demorar mais do que o tempo de 60 segundos o server não executa a mesma tarefa que já está em execução eu concordo. Mas seria a única coisa que poderia dar errado mesmo, mas esta consulta dura menos de 0.00014. É muito estranho.

 

O que você acha de eu colocar isso com while infinito e sleep de 1 em 1 segundo? Como faço para para-lo se precisar?

 

Tb sou de ctba...São lourenço

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Os scripts PHP tem um tempo limite de execução. Você pode alterar esse limite no php.ini, mas se o script ficar sendo executado initerrupidamente poderá ir acumulando processos e consumir muita memória do servidor.

 

Até onde eu sei o intervalo mínimo do Crontab é de 1 em 1 minuto, então se você realmente precisa desta rotina executando sempre de 1 em 1 segundo, eu recomendo o seguinte:

 

1) Programe no Cron para executar o seu script de 1 em 1 minuto.

 

2) No seu script você faz o controle para ele executar 30 vezes e abortar, ou seja, executar 30 vezes a função e dar o intervalo de 1 segundo 30 vezes com o uso da função sleep(). O script levará 60 segundos (1 minuto) para ser executado, então o Crontab irá chamá-lo novamente no próximo minuto.

 

Não sei se isso vai dar certo mas foi o que eu pensei no momento.

 

Se a função demorar mais de 1 segundo para ser executada você deve programar para que seja executada menos de 30 vezes em cada chamada ao script, se não irá gerar um atraso e o script poderá ser executado mais de uma vez simultaneamente.

 

Um abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Os scripts PHP tem um tempo limite de execução. Você pode alterar esse limite no php.ini, mas se o script ficar sendo executado initerrupidamente poderá ir acumulando processos e consumir muita memória do servidor.

 

Até onde eu sei o intervalo mínimo do Crontab é de 1 em 1 minuto, então se você realmente precisa desta rotina executando sempre de 1 em 1 segundo, eu recomendo o seguinte:

 

1) Programe no Cron para executar o seu script de 1 em 1 minuto.

 

2) No seu script você faz o controle para ele executar 30 vezes e abortar, ou seja, executar 30 vezes a função e dar o intervalo de 1 segundo 30 vezes com o uso da função sleep(). O script levará 60 segundos (1 minuto) para ser executado, então o Crontab irá chamá-lo novamente no próximo minuto.

 

Não sei se isso vai dar certo mas foi o que eu pensei no momento.

 

Se a função demorar mais de 1 segundo para ser executada você deve programar para que seja executada menos de 30 vezes em cada chamada ao script, se não irá gerar um atraso e o script poderá ser executado mais de uma vez simultaneamente.

 

Um abraço!

 

Valeu pela dica, porém veja só no script que passei acima:

set_time_limit(0);

isto ignora o php.ini e tornando-se sem limite de execução.

Também concordo contigo sobre a execução das tarefas simultaneas o que não pode ocorrer no meu caso.

A única solução que achei para o caso foi com o while infinito e esquecer o cron. Porque?

 

- Não haveria problemas com a tarefa sendo executada 2 vezes (Já aconteceu isso)

- Não haveria problemas com a tarefa de ela não ser chamada (Já existe 1 em execução e o cron ou o linux não a chama de novo) como explica nosso amigo Beraldo que também ja aconteceu comigo.

- Sempre estará em execução, setando o tempo limite de execução para infinito pelo set_time_limite(0) e while(0)

 

Os Problemas e dúvidas:

1 - Como parar está execução futuramente (por atualização do script ou algo similar). Depois de iniciado jamais se para ele via browser, pois não tem tempo limite de execução do script(ignora totalmente o php.ini), é ignorado a desconexão pelo ignore_user_abort(se fechar o navegador a tarefa continua pelo server). Tudo isto para que a tarefa não pare mesmo e siga continuamente, tem que ser assim ou outra coisa que desconheço, sobre tarefas infinitas. Mas como para-la no servidor futuramente? Somente o DataCenter na frente do Server?

 

2 - Como devo chamar a primeira vez deste script? Via browser mesmo(já que ele ignora a desconexão) ou via cron 1 vez e apago o cron depois que iniciar(apagar porque se não vai ficar simultanea com outra e causaria erro nos dados)? Vi que tarefas executadas via cron ou internamente tem prioridade no server por ser "owner", posso estar errado, por isto a dúvida. Como chamar a primeira vez esta tarefa?(é uma tarefa de prioridade absoluta e deve até parar as conexões com usuários ou qualquer outra coisa q esta sendo feita no server. Só lembro que atualmente a tarefa demora 0.00014 para execução em cada segundo). Então como chamo está tarefa?

 

Olha, muito obrigado a todos que me responderam e a todos que irão me responder ainda. Sou novo neste forum e vou colaborar bastante com todos e se alguém necessitar de minha ajuda e puder ajudar vai ser um prazer.

 

Aguardo anciosamente pois estou de castigo este domingo tentando resolver isto, pois uma nova falha deste tipo estarei ferrado.

Grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se ao fechar o navegador o script continuar rodando initerrupidamente você poderá chamá-lo via browser sem nenhum problema, se não você terá que usar o Cron para iniciar a execução.

 

Para parar a execução do script basta você usar um comando Linux para matar o processo, isso poderá ser feito via SSH ou então através de outro script PHP usando a função system(), se o seu servidor permitir.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Outra forma que pensei para interromper a execução do script foi a seguinte:

 

while (file_get_contents('controle.txt') == 1) {
 // Rotina aqui
}

Neste exemplo, você teria um arquivo chamado controle.txt contendo o número 1, quando você quisesse parar o script editaria o arquivo colocando o número 0, então o loop do while iria parar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.