3. Agendamento de Inicialização de Comandos

3.1. crontab: Reporting ou Editando o Arquivo crontab

O crontab permite que você execute comandos em um intervalo regular de tempo com o bônus adicioal de que você não precisa estar logado para que isto aconteça. O crontab irá enviar para você, por e-mail, a saída do comando. Você pode especificar os intervalos em minutos, horas, dias e até meses. Dependendo das opções, o crontab irá agir de maneira diferente:

  • -l: exibe o conteúdo do arquivo crontab;

  • -e: edita o arquivo crontab;

  • -r: remove o arquivo crontab;

  • -u <usuário>: aplica uma das opções acima para o usuário indicado. Somente o root pode fazer isto.

Vamos começar editando um arquivo crontab. Se você digitar crontab -e, o editor de sua preferência será aberto, caso você tenha configurado as variáveis de ambiente EDITOR ou VISUAL, senão o Vi será o editor utilizado. Uma linha no arquivo crontab é feita de seis campos. Os primeiros cinco campos são os intervalos de tempo para minutos, horas, dias do mês, mês e dias da semana. O sexto campo é o comando a ser executado. Linhas que começam com um # são consideradas comentários e serão ignoradas pelo crond (o programa que é responsável por executar os arquivos crontab). Este formato é um pouco diferente para o sistema crontab, em /etc/crontab. Lá, o sexto campo é o nome do usuário que deveria ser utilizado para iniciar o programa no sétimo campo. Ele deveria ser utilizado somente para tarefas administrativas, e para processos em execução de usuários que existem somente para aumentar a segurança do sistema (como o suário de um anti-vírus ou um usuário criado para executar um servidor de banco de dados). Aqui está um exemplo do crontab:

[Nota]Nota

Para imprimir o arquivo de uma maneira legível, nós tivemos que quebrar as linhas que eram grandes demais. Então, alguns blocos devem ser digitados em uma única linha. Quando o caractere \ finaliza uma linha, significa que esta linha possui continuação. Esta convenção funciona com os arquivos Makefile e no shell, assim como em outros contextos.

# Se você não deseja receber e-mail,
# comente a seguinte linha
#MAILTO="seu_endereço_de_e-mail"
#
# Avise a cada 2 dias sobre novas imagens, 
#   como no exemplo acima - e depois disto, "crie novamente"
#   o arquivo de "data". O "%" é tratado como uma nova 
#   linha, o que lhe possibilita colocar vários comandos 
#   em uma mesma linha.
0 14 */2 * *  find /shared/images              \
  -cnewer /shared/images/stamp                 \
  -a -iregex ".*\.jpe?g"             \
  -a -not -regex                               \
    ".*/old/.*"%touch /shared/images/stamp
#
# Todo Natal toque uma melodia :)
0 0 25 12 * mpg123 $HOME/sounds/merryxmas.mp3
#
# Toda terça-feira às 17h, exiba a lista de compras...
0 17 * * 2 lpr $HOME/shopping-list.txt

Há várias outras maneiras de especificar intervalos diferentes das apresentadas neste exemplo. Você pode especificar um conjunto de valores discretos separados por vírgulas (1,14,23) ou um intervalo (1-15), ou até combinar as duas formas (1-10,12-20), opcionalmente com um valor de step, que pulará a seqüência com o valor indicado (1-12,20-27/2).

3.2. at: Agendando uma Comando uma Única Vez

Pode ser que você queira agendar um comando para um determinado dia, mas sem uma certa freqüência, como ser lembrado de um compromisso às 18:00 horas de oje. Você executa o X, o pacote X11R6-contrib é instalado e então você é avisado às 17:30 que você precisa ir. Para isso, o at é exatamente o que você preisa:

$ at 5:30pm
 # You're now in front of the "at" prompt
at> xmessage "Hora de ir! Compromisso às 18:00 horas"
 # Type CTRL-d to exit
at> <EOT>
job 1 at 2005-02-23 17:30
$

Você pode especificar o tempo de outras formas:

  • now + <intervalo>: significa o intervalo indicado a partir do momento em que o comando foi executado. A sintaxe para o intervalo é <n> (minutes|hours|days|weeks|months). Por exemplo, você pode especificar now + 1 hour (uma hora a partir de agora), now + 3 days (três dias a partir de agora) e assim por diante.

  • <horário> <dia>: especifica a data de maneira completa. O parâmetro <horário> é obrigatório. O at aceita o parâmtero de diversas maneiras: você pode digitar 0100, 04:20, 2am, 0530pm, 1800, ou um dos três valores especiais: noon (meio-dia), teatime (hora do chá - 16:00 hrs) ou midnight (meia-noite). O parâmetro <dia> é opcional. Você pode indicá-lo de várias formas: a norte-americana, por exemplo, onde 12/20/2001 apontaria para o dia 20 de dezembro de 2001, ou a forma européia, mais parecida com a nossa, 20.12.2001. Você pode omitir o ano, mas somente na forma européia: 20.12. Você também pode especificar o mês com a abreviação em inglês dos meses: tanto Dec 20 como 20 Dec são validos.

O at também aceita algumas opções diferentes:

  • -l: exibe a lista de tarefas agendadas; o primeiro campo é o número da tarefa. É equivalente ao comando atq.

  • -d <n>: remove a tarefa <n> da fila. Você pode obter o número da tarefa através do comando atq. É equivalente ao comando atrm <n>.

Como sempre, veja a página do manual do comando at(1) para mais informações.