Artigo visualizado 1589 vezes

CRON & CRONTAB: Uso e exemplos

Cron

Cron é um daemon[1] que executa comandos agendados. O cron é iniciado automaticamente de /etc/init.d ao entrar em níveis de execução de vários usuários. O cron procura sua área de spool (/var/spool/cron/crontabs) para arquivos crontab (que são nomeados conforme as contas em /etc/passwd); crontabs encontrados são carregados na memória. Observe que os crontabs neste diretório não devem ser acessados ​​diretamente – o comando crontab deve ser usado para acessá-los e atualizá-los.

O cron também lê /etc/crontab, que tem um formato ligeiramente diferente. Além disso, o cron lê os arquivos contidos em /etc/cron.d.

O cron em seguida acorda a cada minuto, examinando todos os arquivos crontab armazenados, verificando cada comando para ver se deve ser executado no horário atual. Ao executar comandos, a saída destes (stdout) é enviada para o proprietário do crontab (ou para o usuário nomeado na variável de ambiente MAILTO do crontab, caso exista). As cópias dos filhos do cron que executam esses processos recebem nome em letras maiúsculas, como será visto nas saídas de syslog e de ps.

Além disso, o cron verifica a cada minuto se o modtime (modification-time) do diretório spool (ou o modtime do arquivo /etc/crontab) foi alterado e, se houver acontecido isso, o cron examinará o modtime de todos os arquivos crontab e recarregará aqueles que foram alterados. Por isso, o cron não precisa ser reiniciado a cada vez que um arquivo crontab for modificado. Observe que o comando crontab (1) atualiza o modtime do diretório spool sempre que ele muda algum crontab.

São feitas considerações especiais quando o relógio do sistema é alterado em menos de 3 horas, por exemplo, no início e no final do horário de verão. Se o tempo se deslocou para frente, os trabalhos que deveriam ter funcionado no horário saltado serão executados logo após a mudança. Por outro lado, se o relógio muda para trás, em menos de 3 horas, os trabalhos que caem no horário repetido não serão executados mais uma vez.

Somente os trabalhos que são executados em determinado momento (não especificado como @hourly, nem com ‘*‘ nos campos de hora ou minuto) são afetados. Os trabalhos com agendamento especificado com coringas (wild cards) são executados com base no novo horário, imediatamente.

As mudanças de relógio em mais de 3 horas são consideradas como correções de horário e o novo horário é assumido de imediato.

No Debian e no Red Hat cron trata os arquivos em /etc/cron.d como extensões ao arquivo /etc/crontab (eles seguem o formato especial deste arquivo, ou seja, eles incluem o campo de usuário). O propósito desse recurso é permitir que os pacotes que exigem um controle mais fino de seu agendamento do que dos diretórios /etc/cron.{daily, weekly, monthly} adicione um arquivo crontab a /etc/cron.d. Esses arquivos devem ser nomeados com a identificação do pacote que os inclui. Os arquivos devem estar em conformidade com a mesma convenção de nomenclatura usada pelas partes executadas: elas devem consistir apenas de letras maiúsculas e minúsculas, dígitos, sublinhados e hifens. Como /etc/crontab, os arquivos no diretório /etc/cron.d são monitorados por alterações.

Você deve usar nomes de caminho absolutos para comandos como /bin/ls. Isso para garantir que você chame o comando correto.

Crontab

crontab é o programa usado para instalar, desinstalar ou listar as tabelas de agendamento usadas para guiar o daemon do cron no Vixie [2] Cron. Cada usuário pode ter seu próprio crontab e, embora estes arquivos estejam em /var/spool/cron/crontabs, eles não devem ser editados diretamente.

Cada usuário tem seu próprio crontab, e os comandos em qualquer crontab dado serão executados como o usuário que possui (proprietário) o crontab. Os usuários uucp e news geralmente terão seus crontabs próprios, eliminando a necessidade de executar, explicitamente, su como parte de um comando cron.

Linhas em branco, espaços iniciais e tabulações são ignorados. Linhas cujo primeiro caractere não especial é um sinal de jogo da velha (# – hash) são comentários e serão ignoradas. Observe que os comentários não são permitidos na mesma linha que os comandos do cron, uma vez que eles serão levados a fazer parte do comando. Da mesma forma, os comentários não são permitidos na mesma linha que as configurações das variáveis de ambiente.

Uma linha ativa em um crontab será uma configuração de ambiente ou um comando cron. Uma configuração de ambiente tem a forma nome = valor, onde os espaços ao redor do sinal de igual (=) são opcionais, e quaisquer espaços subsequentes não iniciais (leading space) no valor serão parte do valor atribuído ao nome. A cadeia de caracteres dos valores pode ser colocada entre aspas (ou apóstrofos) para preservar os espaços em branco iniciais (leading space) ou finais (trailing space). A cadeia de caracteres do valor não é analisada para substituições, portanto linhas como PATH=$HOME/bin:$PATH não funcionarão da forma esperada.

Algumas variáveis ​​de ambiente são configuradas automaticamente pelo daemon do cron. SHELL é configurada para /bin/shLOGNAME e HOME são definidas a partir da linha correspondente ao usuário em /etc/passwd do crontab. PATH está definida para valer “/usr/bin:/bin“. HOMESHELL e PATH podem ser substituídos por configurações específicas no crontab; LOGNAME é o usuário do qual o trabalho está sendo executado e não pode ser alterado. E mais, a variável LOGNAME às vezes é chamada de USER em sistemas BSD, nesses sistemas, o USER também será configurado.

Além de LOGNAMEHOME e SHELL, o cron verificará MAILTO caso tenha algum motivo para enviar mensagens como resultado da execução de comandos “neste” crontab. Se MAILTO estiver definida (e não vazia), um correio será enviado ao usuário assim chamado. Se MAILTO for definida, mas vazia (MAILTO = “”), nenhuma mensagem será enviada. Caso contrário, o correio é enviado ao proprietário do crontab.

Se o arquivo /etc/cron.allow existir, então o usuário deve estar listado no mesmo para poder usar esse recurso. Se o arquivo /etc/cron.allow não existir, mas o arquivo /etc/cron.deny existir, então o usuário não deve estar listado no arquivo (/etc/cron.deny) para usar este recurso. Se nenhum desses arquivos existir, em função dos parâmetros de configuração locais, somente o super usuário (root) poderá usar esse comando ou, por outro lado, todos os usuários poderão usar o recurso de crontab. Em sistemas Debian padrão, todos os usuários podem usar esse comando.

Se a opção -u for usada, especifica o nome de usuário cujo crontab deve ser ajustado. Se esta opção não for fornecida, o crontab examina o “seu” crontab, ou seja, o crontab da pessoa que executa o comando (usuário corrente). Note que su pode confundir o crontab, se você estiver executando sob su, você sempre deve usar a opção -u por garantia de segurança.

A primeira forma deste comando é usada para instalar um novo crontab a partir de algum arquivo especificado ou da entrada padrão se o pseudo-nome de arquivo “-” for indicado.

A opção -l faz com que o crontab atual seja exibido na saída padrão.

A opção -r faz com que o crontab atual seja eliminado (removido).

A opção -e é usada para editar o crontab atual usando o programa editor de texto especificado pelas variáveis ​​de ambiente VISUAL ou EDITOR. O editor especificado deve editar o arquivo no local; qualquer editor que desvincule o arquivo e o recrie não pode ser usado. Depois de sair do editor, o crontab modificado será instalado (ativado) automaticamente.

No sistema Debian GNU / Linux, o cron suporta o módulo pam_env e carrega o ambiente especificado por /etc/security/pam_env.conf. No entanto, a configuração PAM NÃO substitui as configurações descritas acima nem qualquer configuração no próprio arquivo crontab. Observe, em particular, que se você quiser um PATH diferente de “/usr/bin:/bin“, você precisará configurá-lo no arquivo crontab.

Por padrão, o cron enviará o correio usando o cabeçalho “Content-Type:” como “text/plain” com o parâmetro “charset =” definido no charmap / codeset da localização em que o crond é iniciado, ou seja, ou a localização padrão do sistema, se nenhuma variável de ambiente LC_* estiver configurada, ou a localização especificada pelas variáveis ​​de ambiente LC_* (ver man 7 locale). Pode-se usar diferentes codificações de caracteres para a saída do trabalho do cron enviado, configurando as variáveis ​​CONTENT_TYPE e CONTENT_TRANSFER_ENCODING em crontabs, para os valores corretos dos cabeçalhos de e-mail desses nomes.

Formato da crontab

Os comandos são executados pelo cron quando os minutos, horas e meses de ano correspondem à hora atual e quando pelo menos um dos dois campos do dia (dia do mês ou dia da semana) corresponde à hora atual.

Um campo pode ter um asterisco (*), que significa “qualquer”.

Intervalos de números são permitidos. Os intervalos são dois números separados por um hífen. O intervalo especificado é inclusivo. Por exemplo, 8-11 para uma entrada de “horas” especifica a execução nas horas 8, 9, 10 e 11.

Listas são permitidas. Uma lista é um conjunto de números (ou intervalos) separados por vírgulas. Exemplos: “1,2,5,9”, “0-4,8-12”.

Os valores de salto podem ser usados ​​em conjunto com intervalos. Seguir um intervalo com “/” especifica saltos do valor do número dentro do intervalo. Por exemplo, “0-23/2” pode ser usado no campo de horas para especificar a execução do comando a cada duas horas (a alternativa no padrão V7[3] é “0,2,4,6,8,10,12,14,16,18,20,22 “). Os passos também são permitidos após um asterisco, então, se você quer dizer “a cada duas horas”, use apenas “*/2“.

Os nomes também podem ser usados ​​para os campos “mês” e “dia da semana”. Use as primeiras três letras do dia ou mês em particular (em inglês e a caixa não importa). Não são permitidas faixas ou listas de nomes nestes campos.

O “sexto” campo (ou seja, o resto da linha) especifica o comando a ser executado. A parte do comando da linha toda, até uma nova linha ou o caractere porcento (%), será executada por /bin/sh ou pelo shell especificado na variável SHELL do arquivo crontab. Os sinais de porcentagem (%) no comando, a menos que ‘escapado’ com barra invertida (\), serão alterados para caracteres de nova linha e todos os dados após o primeiro % serão enviados ao comando como entrada padrão. Não há como dividir uma única linha de comando em múltiplas linhas, como com o “\” de final de linha do shell.

Nota: O dia da execução de um comando pode ser especificado por dois campos – ‘dia do mês’ e ‘dia da semana’. Se ambos os campos estiverem especificados restritivamente (ou seja, não forem *), o comando será executado quando qualquer dos dois campos corresponder ao momento atual. Por exemplo, “30 4 1,15 * 5” faria com que um comando fosse executado às 4:30 da manhã no dia 1 e 15 de cada mês, mais todas as sextas-feiras.

Em vez dos cinco primeiros campos, uma das oito sequências de caractere especiais pode aparecer:

Tabela 1: Sequências especiais de momentos

CadeiaSignificado
@rebootExecutar uma vez, na inicialização.
@yearlyExecutar uma vez por ano, “0 0 1 1 *“.
@annually(O mesmo que @yearly)
@monthlyExecutar uma vez por mês, “0 0 1 * *“.
@weeklyExecutar uma vez por semana, “0 0 * * 0“.
@dailyExecutar uma vez por dia, “0 0 * * *“.
@midnight(Idêntico a @daily)
@hourlyExecutar uma vez por hora, “0 * * * *“.

Fonte: Página do comando man 5 crontab do Ubuntu Linux 16.04 LTS, 2017

Um exemplo de formato crontab com campos comentados é o seguinte:

#MinuteHourDia do MêsMêsDia da SemanaComando
#(0-59)(0-23)(1-31)(1-12 ou jan-dez)(0-6 ou Sun-Sat)
 0212**/usr/bin/find

Esta linha executa o comando “find” às 2h do dia 12 de cada mês.

Exemplos

Aqui estão alguns exemplos de linhas de crontab. Use o comando “crontab -e” para editar seu arquivo crontab. Esta linha executa o comando “ping” a cada minuto de cada hora de cada dia de cada mês. A saída padrão é redirecionada para /dev/null, então não receberemos e-mail, mas permitiremos que o erro padrão seja enviado como um e-mail. Se você não quer e-mail algum, altere a linha de comando para “/sbin/ping -c 1 192.168.0.1 > /dev/null 2> & 1“.

* * * * * /sbin/ping -c 1 192.168.0.1 > /dev/null

Esta linha executa o comando “ping” e “ls” às 0 e às 12 horas no 1º dia de cada bimestre. Ele também coloca a saída dos comandos no arquivo de log /var/log/cronrun.

0 0,12 1 */2 * /sbin/ping -c 192.168.0.1;  ls -la >> /var/log/cronrun

Esta linha executa o comando de relatório de uso do disco (du) para obter o tamanho do diretório a cada 2 horas do dia 1 ao 10 de cada mês. O e-mail é enviado para os endereços de e-mail especificados com a linha MAILTO. O PATH também está definido para algo diferente do padrão.

PATH = /usr/local/sbin:/usr/local/bin:/home/user1/bin
MAILTO = user1@nowhere.org, user2@somewhere.org
0 2 1-10 * * du -h --max-depth = 1 /

Esta linha exemplifica como executar um trabalho em cron todos os meses às 4h das segundas-feiras além de nos dias entre 15 e 21 (15, 16, 17, 18, 19, 20, e 21). Isso ocorre porque usar os campos do ‘dia do mês’ e ‘dia da semana’ com restrição (diferente de *) torna esta, uma condição “or“, não uma condição “and“. Assim, ambas as restrições serão executadas.

0 4 15-21 * 1 /comando

Executar em cada segundo domingo de cada mês. O comando de verificação (test) deve ser usado devido à característica (ou ‘problema’) mencionada no exemplo anterior.

0 4 8-14 * * test $(data +\%u) -eq 7 && echo "Segundo Domingo"

Pegadinhas ou coisas para verificar

  • Quando o cronjob é executado a partir do crontab de usuários, ele é executado como esse usuário. No entanto, ele não agrega, considera nenhum arquivo no diretório inicial dos usuários, como .cshrc ou .bashrc ou qualquer outro arquivo. Se precisar do cron carregar (ler), qualquer arquivo de configuração de ambiente adicional para seu script, você deve fazê-lo a partir do próprio script que está sendo chamado. Portanto, para definir caminhos, processar arquivos, configurar variáveis ​​de ambiente etc. deve-se tomar as providências devidas.
  • Se a conta de usuários tiver um crontab, mas nenhum shell padrão utilizável em /etc/passwd, o cronjob não será executado. Você terá que designar à conta um shell para que o crontab seja executado.
  • Se o cronjob não estiver executando, verifique se o daemon cron está sendo executado. Então lembre-se de verificar os arquivos /etc/cron.allow e /etc/cron.deny. Se existirem, o usuário que deseja executar trabalhos deve estar em /etc/cron.allow. Você também pode querer verificar se o arquivo /etc/security/access.conf existe. Pode ser necessário adicionar o usuário lá.
  • O crontab não é analisado para substituições ambientais. Você não pode usar coisas como $PATH$HOME ou ~/sbin. Você pode definir coisas como MAILTO = ou PATH = e outras variáveis ​​de ambiente que o shell /bin/sh utilize.
  • Cron não lida com segundos, logo você não pode ter tarefas agendadas em qualquer período de tempo lidando com segundos. Como um cronjob disparando a cada 30 segundos.
  • Você não pode usar % na área de comando (declaração de comando). Ele precisará ser escapado e, se usado ​​com substituição de comando, como o comando date, você pode colocá-lo entre crases. Ex: `date +\%Y-\%m-\%d`. Ou utilize a substituição do comando bash $() (desde que declare SHELL=/bin/bash).
  • Cuidado com ‘dia do mês’ e ‘dia da semana’ juntos. Os campos do ‘dia do mês e ‘dia da semana’ com restrições (não *) tornam esta, uma condição “or” não uma condição “and“. Quando qualquer um dos campos for verdadeiro, o cronjob será executado.

Sites cron úteis

Referências

Pantz.org Technical Reference Site. Cron and Crontab use and exeamples. [S.l.]: pantz.org, 2015. Disponível em: <https://www.pantz.org/software/cron/croninfo.html>. Acesso em 23-junho-2017.

Notas

[1] Em sistemas operacionais multitarefa, um daemon é um programa de computador que executa como um processo em segundo plano, em vez de estar sob o controle direto de um usuário interativo. Tradicionalmente, o nome de processo de um daemon termina com a letra d, para deixar claro que o processo é, de fato, um daemon. No universo Microsoft é conhecido pela denominação serviço.

[2] Paul Vixie responsável pela implementação do cron na 4ª versão do BSD, adicionou um campo para a conta de usuário.

[3] V7, Versão7 ou UNIX Versão 7. Referência a versão do UNIX lançada em 1979, que é a última versão do UNIX sob responsabilidade do Bell Laboratories. Em 1980 o UNIX foi vendido para a AT&T.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.