O cron nada mais é do que o serviço responsável por agendar tarefas no Linux, o cron é tão estabelecido que hoje ele vem instalado na maioria das distribuições. Com o cron é possível agendar tarefas para serem executadas periodicamente ou apenas uma vez.
A tarefas a serem executadas pelo cron ficam dentro de uma tabela a crontab é nela que o desenvolvedor deve cadastrar as execuções desejadas.
Usando um ambiente Linux é muito fácil verificar a disponibilidade do serviço cron, basta executar a seguinte linha de código:
service cron status
Se você possuir o serviço rodando receberá um retorno parecido com este:
cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: ena
Active: active (running) since Mon 2019-01-07 20:21:29 -02; 15min ago
Docs: man:cron(8)
Main PID: 774 (cron)
Tasks: 1 (limit: 4915)
CGroup: /system.slice/cron.service
└─774 /usr/sbin/cron -f
No retorno podemos observar que o serviço está ativo, veja mais alguns comandos que podem modificar o status do serviço:
# Parar o serviço
sudo service cron stop
# Iniciar o serço
sudo service cron start
# Reiniciar o serviço
sudo service cron restart
Antes de editar o arquivo crontab com o agendamento das tarefas, é preciso conhecer a sintaxe do mesmo. Dentro da crontab o usuário deve colocar os seus agendamentos da seguinte maneira, cada linha contém o momento de execução e o comando shell a ser executado. Veja este exemplo:
52 6 1 * * echo "Olá mundo" > /tmp/t.txt
Este agendamento define que:
Todo dia 1º às 6:52 durante o ano todo o cron escreverá Olá mundo
no arquivo t.txt
. Sendo assim os parâmetros são:
.---------------- Minuto (0-59)
| .-------------- Hora (0-23)
| | .------------ Dia do mês (1-31)
| | | .---------- Mês (1-12)
| | | | .-------- Dia da semana (0-6) (Os dias 0 e 7 se referem ao domingo)
| | | | |
| | | | | .---- Comando para ser executado
| | | | | |
* * * * * echo "Olá mundo" > /tmp/t.txt
Atenção: é importante observar que o caractere espaço é o que define a mudança de um parâmetro para outro.
Algumas características da sintaxe:
*
Equivale a todos, exemplo: todos os minutos, todas as horas, todos os dias, etc. De maneira que o comando:
* * * * * echo "Olá mundo" > /tmp/t.txt
O script acima é executado de minuto em minuto.
,
O caractere vírgula pode ser usado para acrescentar mais um momento para o agendamento, ou seja é possível colocar uma vírgula entre duas ou mais horas em que se deseja que o scrip seja executado.
0,30 7,12,15,18 * * * echo "Olá mundo" > /tmp/t.txt
O agendamento acima diz que o script deve ser executado todos os dias do ano nos seguintes horários:
7:00
7:30
12:00
12:30
15:00
15:30
18:00
18:30
-
O caractere traço/hífen cria um intervalo de tempo, com ele é possível definir que um script execute apenas de segunda a sexta ou de janeiro até março. Veja o exemplo:
0,30 7,12,15,18 * * 1-5 echo "Olá mundo" > /tmp/t.txt
Este script executará apenas nas horas do exemplo anterior, mas apenas nos dias: segunda, terça, quarta, quinta, sexta.
Cada usuário possui o seu próprio arquivo de contab, ao editar o arquivo do usuário root os comandos agendados serão executados pelo usuário root, outros usuários seguem a mesma lógica.
Para editar o arquivo da crontab do usuário atual:
# Parâmetro e = editar
crontab -e
Para editar o arquivo crontab de outro usuário:
sudo crontab -u usuario -e
Ao editar o arquivo da crontab pela primeira vez, o sistema irá solicitar ao usuário qual o editor de sua preferência. Basta selecionar um deles para ter acesso ao arquivo. Nele estarão diversos comentário explicando a crontab e contendo até alguns exemplo. Eles podem ser apagados se assim preferir, a última linha de comentários contém a sintaxe dos agendamentos.
Uma vez aberto o arquivo basta editá-lo adicionando todas as tarefas que você deseja agendar. É importante observar que o comando shell pode ser uma chamada para um script complexo que está naquela máquina especifica.
Existem alguns parâmetros verbais que podem ser usados na crontab, veja alguns deles:
Parâmetro | Descrição | Comando equivalente |
---|---|---|
@hourly | Uma vez a cada hora | 0 |
@midnight | Uma vez ao dia | 0 0 * |
@daily | Uma vez ao dia | 0 0 * |
@weekly | Uma vez por semana | 0 0 0 |
@monthly | Uma vez por mês | 0 0 1 |
@annually | Uma vez por ano | 0 0 1 1 * |
@yearly | Uma vez por ano | 0 0 1 1 * |
@reboot | Ao iniciar o computador | - |
Os parâmetros descritos acima, substituem os valores de tempo basta adicionar o comando desejado depois da diretiva escolhida.
Arquivos PHP
podem ser executados via linha de comando, portanto também podem ser executados por uma crontab. Se a lógica da sua aplicação já está em PHP
e você precisa criar uma rotina que controle permissões por exemplo. É possível que isso seja executado diariamente pelo agendamento do cron.
Basta que o desenvolvedor crie um arquivo PHP
que execute o algoritmo desejado e adicionar algo semelhante a isso em sua crontab:
30 7 * * * cd /var/www/html/meu-projeto/ php atualiza_permissoes.php
Não se esqueça de adicionar um controle para que usuários de sua aplicação possam executar o scritp de atualização. Uma sugestão de controle simples:
// Verifica se a execução é via linha de comando
if (PHP_SAPI !== 'cli')
{
die ('Access denied');
}