Enfileirar comandos para execução posterior
Autor: Daniel Madeira | Publicado: 2013-06-13T17:45:00-03:00


Com o comando "at", nos sistemas Linux, podemos agendar a execução de uma tarefa para determinado tempo posterior, seja após um tempo decorrido ou hora e dia específico. A execução ocorrerá apenas uma vez (diferente do cron que executa novamente a tarefa na próxima ocorrência da data) e então a tarefa é removida da fila de agendamentos. Na execução, a tarefa herda o ambiente do momento em que foi criada, isto é, o comando será executado no mesmo diretório e com algumas das variáveis de ambiente do momento do agendamento.O administrador do sistema pode controlar quem poderá agendar tarefas com o comando "at", editando os arquivos "/etc/at.allow" e "/etc/at.deny". Se existir o arquivo "/etc/at.allow", somente os usuários incluídos neste arquivo poderão usar o comando "at". Se não existir e se existir o arquivo "/etc/at.deny", os usuários incluídos neste segundo arquivo não poderão usar o comando "at". Se nenhum dos arquivos existirem, somente o administrador poderá usar o comando "at".Além do comando "at" existem o "atq", que lista todos os agendamentos, e o "atrm", para remover uma tarefa determinada. As tarefas serão executadas pelo serviço "atd".Uma tarefa nada mais é que uma linha de comando qualquer, com seus parâmetros, opções etc. Há basicamente três formas de informar a linha de comando ao "at". Quando executa-se o "at" sem esta informação, a interface exibe um prompt "at&gt;" para que se digite a linha de comando. Digitando Ctrl+D no início de uma nova linha vazia encerra a entrada. A segunda forma é canalizar "|" a linha de comando para o comando "at" e a terceira forma é informar com a opção "-f" o arquivo que contém uma ou mais linhas de comando.O momento para a execução pode ser especificado com diversas sintaxes. Este é o ponto que torna o comando "at" um pouco confuso talvez. As sintaxes podem ser:• A hora no formato HH:MM, para uma hora específica no dia ou, se esta hora já passou, é assumido o dia seguinte;• A hora seguido do sufixo AM ou PM;• Os termos MIDNIGHT, NOON ou TEATIME (4pm);• A data no formato mês dia e ano opcional. Para os meses usa-se JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC;• A hora seguido dos termos TODAY ou TOMORROW;• O termo NOW, ou hora específica, + número seguido de um dos termos MINUTES, HOURS, DAYS ou WEEKS;• O parâmetro "-t" e a data/hora no formato [[CC]YY]MMDDhhmm[.ss].Exemplos:$ at 22:30$ at 10:30pm$ at midnight$ at jul 15 2014$ at 10:30pm jul 15 2014$ at 22:30 tomorrow$ at now + 6 days$ at 5pm + 7 days$ at -t 201407152230$ at -f tarefas.txt now + 1 hourO comando "atq" ou "at -l" retorna todas as tarefas agendadas ou em execução no momento. Sua saída exibe o número da tarefa, a hora agendada e o nome do usuário. O comando "atrm", "at -r" ou "at -d" seguido do número da tarefa remove a tarefa especificada pelo número.No mesmo pacote existe o comando "batch" (ou "at -b"), que possui o mesmo funcionamento e sintaxe do "at" porém executa a tarefa somente se o nível de carga do sistema estiver baixo, isto é, se a carga média do sistema (load average) estiver abaixo de 0,8 (ou outro valor especificado na invocação do atd). Assim, em um sistema sobrecarregado a tarefa não será executada.O comando "at" pode também informar o usuário por e-mail quando a tarefa for concluída, quando usado o parâmetro -m. E ainda, assim como no cron, o usuário não precisa estar logado no sistema no momento da data e hora do agendamento, pois o serviço "atd" fará a execução.