107.2 Lição 1
Certificação: |
LPIC-1 |
---|---|
Versão: |
5.0 |
Tópico: |
107 Tarefas administrativas |
Objetivo: |
107.2 Automatizar tarefas de administração do sistema agendando trabalhos |
Lição: |
1 de 2 |
Introdução
Uma das funções mais importantes de um bom administrador de sistema é agendar os jobs (trabalhos) que precisam ser executados regularmente. Por exemplo, um administrador pode criar e automatizar jobs para fazer backups, atualizações do sistema e muitas outras atividades repetitivas. Para isso, usamos o recurso cron
, que serve para para automatizar o agendamento de tarefas periódicas.
Como agendar jobs com o cron
No Linux, cron
é um daemon que roda continuamente e desperta a cada minuto para verificar uma série de tabelas em busca de tarefas a executar. Essas tabelas são chamadas de crontabs e contêm os chamados cron jobs (trabalhos cron). O Cron é adequado para servidores e sistemas que estão constantemente ligados, pois cada cron job é executado somente se o sistema estiver rodando no horário programado. Ele pode ser usado por usuários comuns, cada um com seu próprio crontab
, bem como pelo usuário root, que gerencia os crontabs do sistema.
Note
|
No Linux, também existe o recurso |
Crontabs de usuário
Os crontabs de usuário são arquivos de texto que gerenciam o agendamento de trabalhos cron definidos pelo usuário. Eles sempre têm o nome da conta de usuário que os criou, mas a localização desses arquivos depende da distribuição usada (geralmente é um subdiretório de /var/spool/cron
).
Cada linha em um crontab de usuário contém seis campos separados por um espaço:
-
O minuto da hora (0-59).
-
A hora do dia (0-23).
-
O dia do mês (1-31).
-
O mês do ano (1-12).
-
O dia da semana (0-7 com Domingo=0 ou Domingo=7).
-
O comando a executar.
Para o mês do ano e o dia da semana, podemos usar as três primeiras letras do nome em vez do número correspondente.
Os primeiros cinco campos indicam quando executar o comando especificado no sexto campo e podem conter um ou mais valores. Em particular, é possível especificar vários valores usando:
*
(asterisco)-
Refere-se a qualquer valor.
,
(vírgula)-
Especifica uma lista de valores possíveis.
-
(hífen)-
Especifica um intervalo de valores possíveis.
/
(barra)-
Especifica valores escalonados.
Muitas distribuições incluem o arquivo /etc/crontab
, que pode ser usado como referência para a disposição dos elementos de um arquivo cron
. Eis um exemplo de arquivo /etc/crontab
de uma instalação de Debian:
SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed
Crontabs de sistema
Os crontabs de sistema são arquivos de texto que gerenciam a programação de cron jobs do sistema e só podem ser editados pelo usuário root. /etc/crontab
e todos os arquivos no diretório /etc/cron.d
são crontabs de sistema.
A maioria das distribuições inclui também os diretórios /etc/cron.hourly
(de hora em hora), /etc/cron.daily
(diariamente), /etc/cron.weekly
(semanalmente) e /etc/cron.monthly
(mensalmente), que contêm scripts que devem ser executados com a frequência adequada. Por exemplo, se você quiser executar um script diariamente, pode colocá-lo em /etc/cron.daily
.
Warning
|
Algumas distribuições usam |
A sintaxe dos crontabs de sistema é semelhante à dos crontabs de usuário, porém ela requer um campo adicional obrigatório que especifica qual usuário executará o cron job. Portanto, cada linha em um crontab de sistema contém sete campos separados por um espaço:
-
O minuto da hora (0-59).
-
A hora do dia (0-23).
-
O dia do mês (1-31).
-
O mês do ano (1-12).
-
O dia da semana (0-7 com Domingo=0 ou Domingo=7).
-
O nome da conta de usuário a ser usada ao executar o comando.
-
O comando a executar.
Quanto aos crontabs do usuário, podemos especificar mais de um valor nos campos de tempo usando os operadores *
, ,
, -
e /
. Também é possível indicar o mês do ano e o dia da semana com as três primeiras letras do nome em vez do número correspondente.
Especificações de tempo particulares
Ao editar os arquivos crontab, podemos usar atalhos especiais nas primeiras cinco colunas em vez das especificações de tempo:
@reboot
-
Roda a tarefa especificada uma vez após a reinicialização.
@hourly
-
Roda a tarefa especificada uma vez por hora no início da hora.
@daily
(or@midnight
)-
Roda a tarefa especificada uma vez por dia à meia-noite.
@weekly
-
Roda a tarefa especificada uma vez por semana, à meia-noite de domingo.
@monthly
-
Roda a tarefa especificada uma vez por mês, à meia-noite do primeiro dia do mês.
@yearly
(or@annually
)-
Roda a tarefa especificada uma vez por ano, à meia-noite de 1º de janeiro.
Variáveis no crontab
Dentro de um arquivo crontab, pode haver atribuições de variáveis definidas antes que as tarefas agendadas sejam declaradas. As variáveis de ambiente comumente definidas são:
HOME
-
O diretório no qual o
cron
invoca os comandos (por padrão, o diretório inicial do usuário). MAILTO
-
O nome do usuário ou o endereço para o qual a saída e o erro padrão são enviados (por padrão, o proprietário do crontab). Diversos valores separados por vírgulas também são permitidos, e um valor vazio indica que nenhum email deve ser enviado.
PATH
-
O caminho no qual os comandos podem ser encontrados.
SHELL
-
O shell a ser usado (por padrão
/bin/sh
).
Criando cron jobs de usuário
O comando crontab
é usado para manter arquivos crontab para usuários individuais. Em particular, o comando crontab -e
serve para editar seu próprio arquivo crontab ou para criar um, caso ele ainda não exista.
$ crontab -e no crontab for frank - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/ed 2. /bin/nano < ‑‑‑‑ easiest 3. /usr/bin/emacs24 4. /usr/bin/vim.tiny Choose 1-4 [2]:
Por padrão, o comando crontab
abre o editor especificado pelas variáveis de ambiente VISUAL
ou EDITOR
para que você possa começar a editar seu arquivo crontab com o editor de sua preferência. Algumas distribuições, como mostrado no exemplo acima, permitem escolher o editor em uma lista quando crontab
é executado pela primeira vez.
Se você deseja executar o script foo.sh
, localizado em seu diretório inicial, todos os dias às 10:00, adicione a seguinte linha ao seu arquivo crontab:
0 10 * * * /home/frank/foo.sh
Considere os seguintes exemplos de entradas de crontab:
0,15,30,45 08 * * 2 /home/frank/bar.sh 30 20 1-15 1,6 1-5 /home/frank/foobar.sh
Na primeira linha, o script bar.sh
é executado todas as terças-feiras às 08:00, às 08:15, às 08:30 e às 08:45. Na segunda linha, o script foobar.sh
é executado às 20h30 de segunda a sexta-feira durante os primeiros quinze dias de janeiro e junho.
Warning
|
Embora os arquivos crontab possam ser editados manualmente, é sempre recomendável usar o comando |
Além da opção -e
mencionada acima, o comando crontab
inclui outras opções úteis:
-l
-
Exibe o crontab atual na saída padrão.
-r
-
Remove o crontab atual.
-u
-
Especifica o nome do usuário cujo crontab precisa ser modificado. Esta opção requer privilégios de root e permite que o usuário root edite os arquivos crontab do usuário.
Criando cron jobs do sistema
Ao contrário dos crontabs de usuário, os crontabs de sistema são atualizados com um editor; portanto, não é preciso executar o comando crontab
para editar /etc/crontab
e os arquivos em /etc/cron.d
. Lembre-se de que, ao editar crontabs do sistema, é necessário especificar a conta que será usada para executar o cron job (geralmente o usuário root).
Por exemplo, para executar o script barfoo.sh
localizado no diretório /root
todos os dias à 01:30, abra /etc/crontab
com seu editor preferido e adicione a seguinte linha:
30 01 * * * root /root/barfoo.sh >>/root/output.log 2>>/root/error.log
No exemplo acima, a saída do job é anexada a /root/output.log
, enquanto os erros são anexados a /root/error.log
.
Warning
|
Exceto nos casos em que a saída é redirecionada para um arquivo, como no exemplo acima (ou se a variável |
Configurando o acesso ao agendamento de trabalhos
No Linux, os arquivos /etc/cron.allow
e /etc/cron.deny
são usados para definir as restrições do crontab
. Em particular, eles servem para permitir ou proibir o agendamento de trabalhos cron para diferentes usuários. Se /etc/cron.allow
existir, apenas usuários não root listados nele podem agendar trabalhos cron usando o comando crontab
. Se /etc/cron.allow
não existir, mas /etc/cron.deny
sim, apenas usuários não root listados neste arquivo não podem agendar trabalhos cron usando o comando crontab
(neste caso, um /etc/cron.deny
vazio significa que todos os usuários têm permissão para agendar trabalhos cron com o crontab
). Se nenhum desses arquivos existir, o acesso do usuário ao agendamento de trabalhos cron dependerá da distribuição usada.
Note
|
Os arquivos |
Uma alternativa ao cron
Usando o systemd como gerenciador de sistema e serviços, podemos definir temporizadores como alternativa ao cron
para agendar tarefas. Temporizadores são arquivos da unidade systemd identificados pelo sufixo .timer
. Para cada um deles, deve haver um arquivo de unidade correspondente descrevendo a unidade a ser ativada quando o temporizador terminar. Por padrão, um timer
ativa um serviço com o mesmo nome, exceto pelo sufixo.
Um temporizador inclui uma seção [Timer]
que especifica quando os jobs agendados devem ser executados. Especificamente, podemos usar a opção OnCalendar=
para definir temporizadores em tempo real, que funcionam da mesma maneira que os cron jobs (baseiam-se na expressão de eventos de calendário). A opção OnCalendar=
requer a seguinte sintaxe:
DayOfWeek Year-Month-Day Hour:Minute:Second
sendo DayOfWeek
opcional. Os operadores *
, /
e ,
têm o mesmo significado dos que são usados para cron jobs. Usamos ..
entre dois valores para indicar um intervalo contíguo. Na especificação DayOfWeek
(dia da semana), podemos usar as primeiras três letras do nome ou o nome completo.
Note
|
Você também pode definir temporizadores monotônicos, que são ativados após algum tempo decorrido de um ponto de início específico (por exemplo, quando a máquina foi inicializada ou quando o próprio temporizador foi ativado). |
Por exemplo, para rodar o serviço /etc/systemd/system/foobar.service
às 05:30 da primeira segunda-feira do mês, adicionamos as seguintes linhas no arquivo de unidade /etc/systemd/system/foobar.timer
correspondente:
[Unit] Description=Run the foobar service [Timer] OnCalendar=Mon *-*-1..7 05:30:00 Persistent=true [Install] WantedBy=timers.target
Depois de criar o novo temporizador, você pode ativá-lo e iniciá-lo executando os seguintes comandos como root:
# systemctl enable foobar.timer # systemctl start foobar.timer
Podemos alterar a frequência do trabalho agendado modificando o valor OnCalendar
e, em seguida, digitando o comando systemctl daemon-reload
.
Finalmente, se você quiser ver a lista de temporizadores ativos ordenados pelo momento em que terminam, use o comando systemctl list-timers
. A opção --all
exibe também as unidades de temporizador inativas.
Note
|
Lembre-se de que os temporizadores são registrados no diário do systemd e você pode rever os registros das diferentes unidades usando o comando |
Em vez da forma normalizada mais longa mencionada acima, é possível usar algumas expressões especiais que descrevem frequências específicas para a execução de um job:
hourly
-
Roda a tarefa especificada uma vez por hora, no início da hora.
daily
-
Roda a tarefa especificada uma vez por dia à meia-noite.
weekly
-
Roda a tarefa especificada uma vez por semana, na meia-noite de segunda-feira.
monthly
-
Roda a tarefa especificada uma vez por mês, na meia-noite do primeiro dia do mês.
yearly
-
Roda a tarefa especificada uma vez por ano, na meia-noite de 1º de janeiro.
Consulte as páginas de manual para ver a lista completa de especificações de hora e data em systemd.timer(5)
.
Exercícios Guiados
-
Para cada um dos seguintes atalhos de
crontab
, indique a especificação de tempo correspondente (ou seja, as cinco primeiras colunas de um arquivocrontab
de usuário):@hourly
@daily
@weekly
@monthly
@annually
-
Para cada um dos seguintes atalhos de
OnCalendar
, indique a especificação de tempo correspondente (a forma normalizada mais longa):hourly
daily
weekly
monthly
yearly
-
Explique o significado das seguintes especificações de tempo encontradas em um arquivo
crontab
:30 13 * * 1-5
00 09-18 * * *
30 08 1 1 *
0,20,40 11 * * Sun
00 09 10-20 1-3 *
*/20 * * * *
-
Explique o significado das seguintes especificações de tempo usadas na opção
OnCalendar
de um arquivo de temporizador:*-*-* 08:30:00
Sat,Sun *-*-* 05:00:00
*-*-01 13:15,30,45:00
Fri *-09..12-* 16:20:00
Mon,Tue *-*-1,15 08:30:00
*-*-* *:00/05:00
Exercícios Exploratórios
-
Pressupondo que você esteja autorizado a agendar tarefas com o
cron
como um usuário comum, qual comando você usaria para criar seu próprio arquivo crontab? -
Crie um job agendado simples que execute o comando
date
todas as sextas-feiras às 13h. Onde você poderia ver o resultado deste trabalho? -
Crie outro job agendado que execute o script
foobar.sh
a cada minuto, redirecionando a saída para o arquivooutput.log
em seu diretório inicial de forma que apenas o erro padrão seja enviado a você por email. -
Observe a entrada
crontab
do job agendado que acaba de criar. Por que não é necessário especificar o caminho absoluto do arquivo no qual a saída padrão é salva? E por que podemos usar o comando./foobar.sh
para executar o script? -
Edite a entrada
crontab
anterior removendo o redirecionamento de saída e desabilite o primeiro cron job que criou. -
Como é possível enviar a saída e os erros do seu trabalho agendado para a conta de usuário
emma
via email? E como evitar o envio da saída padrão e erros por email? -
Execute o comando
ls -l /usr/bin/crontab
. Qual bit especial está definido e qual é o seu significado?
Resumo
Nesta lição, você aprendeu:
-
Usar
cron
para executar jobs em intervalos regulares. -
Gerenciar os cron jobs.
-
Configurar o acesso de usuário ao agendamento de cron jobs.
-
Entender o papel das unidades de temporizador do systemd como alternativa ao
cron
.
Os seguintes comandos e arquivos foram discutidos nesta lição:
crontab
-
Mantém os arquivos
crontab
de usuários individuais. /etc/cron.allow
e/etc/cron.deny
-
Arquivos particulares usados para definir as restrições do
crontab
. /etc/crontab
-
Arquivo crontab do sistema.
/etc/cron.d
-
O diretório que contém os arquivos crontab do sistema.
systemctl
-
Controla o sistema e o gerenciador de serviços systemd. Em relação aos temporizadores, pode ser utilizado para habilitá-los e iniciá-los.
Respostas aos Exercícios Guiados
-
Para cada um dos seguintes atalhos de
crontab
, indique a especificação de tempo correspondente (ou seja, as cinco primeiras colunas de um arquivocrontab
de usuário):@hourly
0 * * * *
@daily
0 0 * * *
@weekly
0 0 * * 0
@monthly
0 0 1 * *
@annually
0 0 1 1 *
-
Para cada um dos seguintes atalhos de
OnCalendar
, indique a especificação de tempo correspondente (a forma normalizada mais longa):hourly
*-*-* *:00:00
daily
*-*-* 00:00:00
weekly
Mon *-*-* 00:00:00
monthly
*-*-01 00:00:00
yearly
*-01-01 00:00:00
-
Explique o significado das seguintes especificações de tempo encontradas em um arquivo
crontab
:30 13 * * 1-5
Às 13h30 todos os dias da semana, de segunda a sexta-feira
00 09-18 * * *
Todos os dias e todas as horas das 09h00 às 18h00
30 08 1 1 *
Às 08h30 do primeiro dia de janeiro
0,20,40 11 * * Sun
Todos os domingos às 11h, 11h20 e 11h40
00 09 10-20 1-3 *
Às 09h00 de 10 a 20 de janeiro, fevereiro e março
*/20 * * * *
A cada vinte minutos
-
Explique o significado das seguintes especificações de tempo usadas na opção
OnCalendar
de um arquivo de temporizador:*-*-* 08:30:00
Todos os dias às 08:30
Sat,Sun *-*-* 05:00:00
Sábado e domingo às 05h00
*-*-01 13:15,30,45:00
Às 13h15, 13h30 e 13h45 do primeiro dia do mês
Fri *-09..12-* 16:20:00
Às 16h20 todas as sextas-feiras de setembro, outubro, novembro e dezembro
Mon,Tue *-*-1,15 08:30:00
Às 08h30 do primeiro ou décimo quinto dia de cada mês, apenas se o dia for segunda ou terça-feira
*-*-* *:00/05:00
A cada cinco minutos
Respostas aos Exercícios Exploratórios
-
Pressupondo que você esteja autorizado a agendar tarefas com o
cron
como um usuário comum, qual comando você usaria para criar seu próprio arquivo crontab?dave@hostname ~ $ crontab -e no crontab for dave - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/ed 2. /bin/nano < ---- easiest 3. /usr/bin/emacs24 4. /usr/bin/vim.tiny Choose 1-4 [2]:
-
Crie um job agendado simples que execute o comando
date
todas as sextas-feiras às 13h. Onde você poderia ver o resultado deste trabalho?00 13 * * 5 date
A saída é enviada ao usuário; para visualizá-la, use o comando
mail
. -
Crie outro job agendado que execute o script
foobar.sh
a cada minuto, redirecionando a saída para o arquivooutput.log
em seu diretório inicial de forma que apenas o erro padrão seja enviado a você por email.*/1 * * * * ./foobar.sh >> output.log
-
Observe a entrada
crontab
do job agendado que acaba de criar. Por que não é necessário especificar o caminho absoluto do arquivo no qual a saída padrão é salva? E por que podemos usar o comando./foobar.sh
para executar o script?cron
invoca os comandos do diretório inicial do usuário, a menos que outro local seja especificado pela variável de ambienteHOME
dentro do arquivocrontab
. Por esta razão, podemos usar o caminho relativo do arquivo de saída e executar o script com./foobar.sh
. -
Edite a entrada
crontab
anterior removendo o redirecionamento de saída e desabilite o primeiro cron job que criou.#00 13 * * 5 date */1 * * * * ./foobar.sh
Para desabilitar um trabalho cron, podemos simplesmente comentar a linha correspondente dentro do arquivo
crontab
. -
Como é possível enviar a saída e os erros do seu trabalho agendado para a conta de usuário
emma
via email? E como evitar o envio da saída padrão e erros por email?Para enviar a saída padrão e o erro para
emma
, definimos a variável de ambienteMAILTO
em nosso arquivocrontab
desta forma:MAILTO="emma"
Para dizer ao
cron
que nenhum email deve ser enviado, atribuímos um valor vazio à variável de ambienteMAILTO
.MAILTO=""
-
Execute o comando
ls -l /usr/bin/crontab
. Qual bit especial está definido e qual é o seu significado?$ ls -l /usr/bin/crontab -rwxr-sr-x 1 root crontab 25104 feb 10 2015 /usr/bin/crontab
O comando
crontab
tem o bit SGID definido (o caracteres
ao invés do sinalizador executável para o grupo), o que significa que é executado com os privilégios do grupo (portanto,crontab
). É por isso que usuários comuns podem editar seu arquivocrontab
usando o comandocrontab
. Note que muitas distribuições definem as permissões de arquivo de tal forma que os arquivoscrontab
só podem ser editados por meio do comandocrontab
.