Cron e crontab o que são ? E para que servem?
Certamente muitos de vós já se depararam com estes 2 termos e questionaram-se sobre o que seriam e que função desempenhavam. Ambos são processos que são exclusivos de sistemas UNIX ou seja linux e openbsd entre outros.
O crontab serve de arquivo para as tarefas que queremos que sejam automatizadas como por exemplo:
- fazer backups
- apagar ficheiros
- corrigir erros do sistema
- actualizar o sistema
- entre outras coisas.
Enquanto que o Cron vai utilizar esse arquivo e vai verificar de x em x tempo se a tarefa já foi executada ou ainda está a ser executada e verifica também a quanto tempo foi executada. Caso ainda não tenha sido executada o cron irá executar essa tarefa de forma autónoma e irá ter o nome de cronjob. De referir que é tudo executado na shell do sistema (terminal).
Dito assim pode parecer muito confuso mas tentarei elucidar-vos melhor sobre isto com um caso concreto.
Imaginem que querem que um script seja executado de meia em meia hora, script esse que irá fazer backup de uma pasta.
Para tal tem-se que “dizer” ao cron que de X em X tempo o script em questão tem que ser executado e o cron
pega nessa informação e guarda-a num ficheiro crontab e a partir desse momento , o cron irá verificar de x em x tempo
se o script está a ser executado ou não.
Senão estiver irá executa-lo , caso esteja já a ser executado o
cron não vai fazer nada alem de continuar a “vigiar” essa tarefa para o caso de alguma anomalia a afectar
e então o cron volta a executa-la.
Existem 2 formas de o cron actuar:
Global;
Local.
No caso da global é o root do sistema que define na crontab o que tem se verificar e fazer. E aplica-se a todos os utilizadores.
Enquanto que na global o cron apenas irá actuar na conta do utilizador que o criou.
Para configurar um crontab para um utilizador usa-se a seguinte sintaxe:
- -l utilizador – lista as tarefas agendadas para utilizador
- -e utilizador – Edita o crontab
- -r utilizador – apaga o crontab do utilizador
- -c directoria – especifica um directoria para o Crontab
Para verificar todos os crontabs de um utilizador basta ver esta directoria:
/var/spool/cron/utilizador
E para editar os crontabs globais basta editar este ficheiro “/etc/crontab“ .
Agora que falamos do que é cada coisa vou passar a explicar a sintaxe de um crontab. A sintaxe dos crontabs é divida em 6 partes:
- Minuto: que tem valores entre 0 e 59;
- Hora : que tem valores entre 0 e 23;
- Dia : 1-31
- Mês : 1-12
- Dia da Semana : 0-7/Sun-Sat , o 0 e o 7 representam o domingo;
- Comando a ser executado.
Por exemplo se quisermos que um determinado script seja executado todos os dias as 16horas basta fazer isto:
0 16 * * * /home/dev/backup.py
Pode-se complementar isto usando os caracteres especiais que permitem definir mais condições no que é para ser feito:
-Asterisco(*): com este carácter indicamos que serão seleccionados todos os valores do campo em que foi usado, ao seja se usarmos o no campo horas significa que o cron vai ser executados em todas as horas.
-Barra ( / ): com este carácter indicamos que o cron será executado consoante o que é definido pela sintax: “/..”, por exemplo se especificar isto no campo horas 59/2 significa que o cron vai ser executado duas vezes por cada hora;
-Virgula( , ): com este carácter separamos vários itens da lista como por ex : “1,2,3” neste caso estamos a definir os meses Janeiro , Fevereiro, Março;
-hífen( - ): Com este carácter definimos uma range de valores por exemplo: 15-23, neste caso definimos todas as horas entre as 15horas e as 23horas;
-**Ponto de interrogação(?):**Com este carácter podemos omitir a especificação do dia do mes e do dia da semana. Atenção que só pode ser utilizado num dos campos;
-L: o L tem como função identificar que o cron só executado no ultimo valor do campo especificado, no caso dos dias será no valor 7(Domingo);
-W: O W só é utilizado no campo “dia da semana” ao seja se indicarmos o valor “w28” o cron só irá ser executado no dia da semana mais perto do valor do dia do mês. Atenção sabado e domingo não são considerados dias úteis(dias da semana)
-cardinal(#): Este carácter só pode ser utilizado no campo dia da semana e tem que ser procedido por um número que vai indicar o dia da semana em que vai ser executado , se tivermos isto : #4 indica que vai executado na segunda quinta-feira de cada mês.