Ir para conteúdo
biakelly

Crontab - como executar mais de um script de uma só vez

Recommended Posts

Olá boa noite :D

 

Tenho uma dúvida, na verdade um desanimo com o Crontab, carinha dificil de se agradar

Tenho os seguintes cron cadastrados:

*/30 * * * * /usr/bin/curl --silent https://meusite/tarefas/cronjobs/aquivo1.php >/dev/null 2>&1
* * * * * /usr/bin/curl --silent https://meusite/tarefas/cronjobs/aquivo2.php >/dev/null 2>&1
* * * * * /usr/bin/curl --silent https://meusite/tarefas/cronjobs/aquivo3.php >/dev/null 2>&1
* * * * * /usr/bin/curl --silent https://meusite/tarefas/cronjobs/aquivo4.php >/dev/null 2>&1
* * * * * /usr/bin/curl --silent https://meusite/tarefas/cronjobs/aquivo5.php >/dev/null 2>&1

E advinhem, nenhum deles funciona, pelo menos no cron, quando os chamo no navegador funciona

Ja me disseram que não é para usar Curl com PHP mas não me disseram porque, então me orientaram buscar algo por .SH

 

Então baseado em algumas pesquisas fiz assim:

 

#!/bin/bash
CONSULT=$((($RANDOM %1000) + 1))
$ php -q https://meusite/tarefas/cronjobs/aquivo1.php 
$ php -q https://meusite/tarefas/cronjobs/aquivo2.php
$ php -q https://meusite/tarefas/cronjobs/aquivo3.php
$ php -q https://meusite/tarefas/cronjobs/aquivo4.php
$ php -q https://meusite/tarefas/cronjobs/aquivo5.php

neste caso estou salvando com o formato arquivo.sh

ja dei permissão desta forma:

 

sudo chmod +x  /path/dir/arquivo.sh

E nada, nadinha nadica de nada 

 

voces ja fizeram alguma tarefa no cron para chamar aquivos PHP? Pooderiam me ajudar?

 

Preciso executar estes 5 arquivos. Basicamentes eles consultam uma api, recolhem um valor e salvaam em uma pasta (bem simples).

 

Todos funcionam se eu os chamo no browser, mas no cron não rodam

 

sim, o cron esta ativo no meu servidor, uso o ubunto 20.4

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @biakelly, tudo bem? :)

 

1 - Geralmente você precisa reiniciar o servidor de cron para que suas alterações sejam efetivadas.

Acho que no ubuntu você faz com o systemctl, então seria isso:

systemctl restart *seu software de cron*

Onde o software pode ser: cron, dcron, cronie, fcron, anacron.
Eu particularmente uso o cronie na minha máquina e nunca tive problemas, mas já utilizei outras em máquinas com diferentes sistemas. O procedimento não é diferente.

Você pode desinstalar sua implementação de cron e instalar uma nova para testar também.

 

2 - Utilize o comando crontab -e para fazer a definição das suas tarefas. crontab -l para listá-las. Você não deve precisar mais do que esses 2 comandos e a reinicialização do serviço.

 

Veja: https://www.digitalocean.com/community/tutorials/how-to-use-cron-to-automate-tasks-ubuntu-1804-pt

 

3 - E por fim, a tarefa cron não deveria estar na sua máquina local, mas no seu servidor. Sua máquina é para desenvolvimento. Você deveria poder desligá-la e saber que suas tarefas continuam rodando. Quem deve fazer a execução dos scripts é o seu servidor.

Se o seu servidor é cPanel, se não me engano geralmente há uma seção do painel destinada apenas para isso, de forma gráfica, sem necessidade de comandos de terminal.

 

E você não deve usar o curl, pois ao fazer isso você cria uma requisição, e isso chama o servidor web, que torna tudo mais lento e consome mais recursos de máquina.

Certa vez desenvolvi um sistema de disparo de e-mails que estava muito lento. Resolvi com algumas leves mudanças, mas a principal foi essa.

 

Você deveria criar suas crons mais ou menos assim:

*/30 * * * * /usr/bin/php /home/bia/cronjobs/aquivo1.php > /home/bia/log_arquivo1.log
* * * * * /usr/bin/php /home/bia/cronjobs/aquivo2.php > /home/bia/log_arquivo2.log
* * * * * /usr/bin/php /home/bia/cronjobs/aquivo3.php > /home/bia/log_arquivo3.log
* * * * * /usr/bin/php /home/bia/cronjobs/aquivo4.php > /home/bia/log_arquivo4.log
* * * * * /usr/bin/php /home/bia/cronjobs/aquivo5.php > /home/bia/log_arquivo5.log

Isso se for para rodar diretamente na sua máquina.

Observe que /usr/bin/php é o caminho do binário do php. Você pode descobrir esse caminho rodando no seu terminal isso: which php. Daí você substitui pelo caminho que coloquei ali, que é o meu caso, mas pode ser diferente do seu.

 

Em um cPanel o comando seria diferente e o caminho do seu arquivo php também.

Perceba que defini um caminho para registro dos logs. Você deve verificar se esse arquivo está sendo criado.

Se os arquivos de log estiverem sendo criados, sua cron está rodando, mas provavelmente está ocorrendo algum erro no seu PHP. Isso o log vai dizer.

Lembre-se de que para o PHP exibir os erros, você precisa habilitá-los, com error_reporting( E_ALL );

 

Ao fazer isso >/dev/null 2>&1, você estava descartando os logs, que são importantes para verificar se tudo está rodando como esperado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @Matheus Tavares :D, tudo bem e você como esta hoje?

 

Estranhamente o Cron funcionava com estes comandos, mas no últimos dias não funcionam mais :/

o que estou fazendo:

 

meu arquivo esta aqui:

/var/www/html/bia/biabot/cron

 

como estou chamando agora noCrontab:

* * * * * /usr/bin/php /var/www/html/bia/biabot/cron/carteiras.php

 

Esse arquivo de carteiras.php verifica uma api e deveria gravar um arquivo salvando com o nome ou substituindo com o nome "carteiras.txt" na seguite pasta:

/var/www/html/bia/biabot/arquivosgerados

 

O que recebo do cron é:

Citar

PHP Warning:  file_put_contents(../arquivosgerados/carteiras.txt): Failed to open stream: No such file or directory in /usr/bin/php /var/www/html/bia/biabot/cron/carteiras.php on line 24

 

 

Meu código chamado carteiras.php:

 

<?php
$curl = curl_init();
curl_setopt_array($curl, array(
  CURLOPT_URL => "https://apilist.tronscan.org/api/token_trc20?contract=TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => array(
    "cache-control: no-cache"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);

$response = json_decode($response, true);
$value1 = $response['trc20_tokens'][0]['holders_count'];
if (empty($value1)) {
  $value1 = is_file('../arquivosgerados/carteiras.txt') ? file_get_contents('../arquivosgerados/carteiras.txt') : null;
} else {
  $value1 = round($value1, 6);
  file_put_contents('../arquivosgerados/carteiras.txt', $value1);
}

Eu sei, não briga comigo sobre o CURL, mas era um arquivo antigo antes de me ensinar sobre o Guzzle que ainda não mudei essa parte :dizzy:

 

Bem, como percebeu estou fazendo o cron com o usuário root, para meu site uso o Cloudflare, não sei se ele esta bloqueando as requisições.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Meu pai eterno, descobri o problema e foi uma bobeira que eu não havia me atentado e que é basica hi hi hi

 

Preparado? Então o Firewall da Cloudflare estava bloqueando o cron, apenas inclui o IP e liberei acesso. Ai meu deus :sleepy:

 

mas aproveitando apenas para não perder o post, mesmo usando esse código acima, ele esta correto? Ou usei muita ganbiarra?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hehe, que bom que deu certo!

 

13 horas atrás, biakelly disse:

mas aproveitando apenas para não perder o post, mesmo usando esse código acima, ele esta correto? Ou usei muita ganbiarra?

Acredito que esteja ok sim, apenas acho que você deveria rodar as crons em um servidor e não na sua máquina local.

Na AWS você poderia rodar de graça por 1 ano inteiro essas crons (depois pode criar uma conta nova e aproveitar outro ano :P).

 

Para isso você iria criar uma instância no EC2 chamado t2.micro, que possui 1gb de ram e 1 vCPU.

https://aws.amazon.com/pt/ec2/instance-types/

 

Poderia ser manualmente pelo EC2 ou através do Elastic Beanstalk (que cria a máquina EC2 para você de forma automática e coloca seu código pra rodar). Vale a pena dar uma olhada nesses serviços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi @Matheus Tavares tudo bem?

 

Hoje estou congelada que frio senhor.:scream:

 

De graça? Vou testar servidores são tão caros que se esse for interessante vou usar sim hi hi

 

Muito obrigada pela dica, vou fazer agora o cadastro

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por brunonative
      Boa noite.
       
      Estou tendo um problema em um sistema e não consigo visualizar uma solução.
      Vamos lá ..
       
      Existe a tabela AGENDAMENTO com as seguintes colunas:  ID | EMAIL IMEDIATO | PRÓXIMO EMAIL | INTERVALO

      EMAIL IMEDIATO e PRÓXIMO EMAIL faz uma consulta na tabela EMAILS onde tem textos cadastrados.
       
      Eu quero que toda vez que for cadastrado um AGENDAMENTO, seja feito o envio na hora do EMAIL IMEDIATO e que o PRÓXIMO EMAIL seja enviado de acordo com o INTERVALO cadastrado.
      O INTERVALO ta sendo cadastrado com  número de 1 a 48, que é o número de horas para o intervalo.
       
      Eu não to conseguindo visualizar uma solução para isso, podem me ajudar?
    • Por ckcesar
      Boa tarde galera.
      Criei um arquivo PHP de teste aqui no meu crontab e ele funciona numa boa, mais quando eu passo um Jquery dentro do meu arquivo ele não funciona mais.
       
      Eu preciso fazer funcionar com o Jquery.
       
      Estou usando o serviço do dreamhost e estou usando linux.
      Olha como eu trato no painel:
      links -dump http://meusite.com.br/crontab/teste.php
      Eu criei para rodar atravez de uma url
       
      Aqui o meu código teste.php PHP.
      Meu script funciona se chamar na url, só não funiona com o crontab
      <?php if(isset($_POST['id'])){ if($_POST['id'] == '20'){ rmdir("teste"); mkdir("teste", 0755); } }else{ echo'<hr/>'; echo'<input type="text" value="20" id="id" name="id" />'; echo" <script> $(document).ready(function(){ $.ajax({ url:'teste.php', type:'POST', data:{ id:$('#id').val() }, success:function(data){ //alert(data); } }); }); </script> "; } ?>  
    • Por eduardobarroscwb
      boa tarde,
       
      Dessa forma minha cron não executa.
       
      10 15 * * * php /var/www/html/retell/report/clientes-excel.php
       
      Mas dessa forma executa:
       
      * * * * * php /var/www/html/retell/report/clientes-excel.php
       
       
      Alguem poderia me dar uma luz??
×

Informação importante

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