107.2 Lição 2
Certificação: |
LPIC-1 |
---|---|
Versão: |
5.0 |
Tópico: |
107 Tarefas administrativas |
Objetivo: |
107.2 Automatizar e agendar tarefas administrativas do sistema |
Lição: |
2 de 2 |
Introdução
Como vimos na lição anterior, podemos agendar tarefas regulares usando o cron ou os temporizadores do systemd, mas às vezes precisamos executar uma tarefa apenas uma vez em um momento específico do futuro. Para isso, existe outro utilitário poderoso: o comando at
.
Agendamento de trabalhos com at
O comando at
é usado para agendamento de tarefas únicas e requer apenas que se especifique quando o trabalho deve ser executado no futuro. Após inserir at
na linha de comando seguido pela especificação de tempo, você entrará no prompt de at
para definir os comandos a serem executados. Saia do prompt com a seqüência de teclas Ctrl+D.
$ at now +5 minutes warning: commands will be executed using /bin/sh at> date at> Ctrl+D job 12 at Sat Sep 14 09:15:00 2019
O job at
no exemplo acima simplesmente executa o comando date
após cinco minutos. Como no caso do cron
, a saída padrão e o erro são enviados por email. Observe que o daemon atd
precisará estar rodando no sistema para ser possível usar o agendamento de tarefas at
.
Note
|
No Linux, o comando |
As opções mais importantes do comando at
são:
-c
-
Imprime os comandos de um ID de trabalho específico na saída padrão.
-d
-
Exclui trabalhos com base em seu ID de trabalho. É um alias para
atrm
. -f
-
Lê o job em um arquivo em vez da entrada padrão.
-l
-
Lista as tarefas pendentes do usuário. Se o usuário for root, todos os trabalhos de todos os usuários serão listados. É um alias para
atq
. -m
-
Envia um email para o usuário no final do trabalho, mesmo se não houver saída.
-q
-
Especifica uma fila na forma de uma única letra de
a
az
e deA
aZ
(por padrão,a
paraat
eb
parabatch
). Os jobs nas filas com as letras mais altas são executados com um valor nice maior. Os jobs enviados a uma fila com uma letra maiúscula são tratados como trabalhos em lote (batch
). -v
-
Mostra a hora em que o trabalho será executado antes de ler o trabalho.
Listar jobs programados com atq
Agora vamos agendar mais dois jobs at
: o primeiro executa o script foo.sh
às 09:30 e o segundo executa o script bar.sh
após uma hora.
$ at 09:30 AM warning: commands will be executed using /bin/sh at> ./foo.sh at> Ctrl+D job 13 at Sat Sep 14 09:30:00 2019 $ at now +2 hours warning: commands will be executed using /bin/sh at> ./bar.sh at> Ctrl+D job 14 at Sat Sep 14 11:10:00 2019
Para listar os jobs pendentes, use o comando atq
, que mostra as seguintes informações para cada job: ID do trabalho, data de execução do trabalho, tempo de execução do trabalho, fila e nome de usuário.
$ atq 14 Sat Sep 14 11:10:00 2019 a frank 13 Sat Sep 14 09:30:00 2019 a frank 12 Sat Sep 14 09:15:00 2019 a frank
Lembre-se de que o comando at -l
é um alias para atq
.
Note
|
Se você executar |
Excluir jobs com atrm
Se quiser excluir um job at
, use o comando atrm
seguido do ID do trabalho. Por exemplo, para excluir o job com ID 14, rodamos o seguinte:
$ atrm 14
É possível excluir vários trabalhos com atrm
especificando diversos IDs separados por espaços. Lembre-se de que o comando at -d
é um alias de atrm
.
Note
|
O usuário que rodar |
Configurando o acesso ao agendamento de trabalhos
A autorização para usuários comuns agendarem jobs at
é determinada pelos arquivos /etc/at.allow
e /etc/at.deny
. Se /etc/at.allow
existir, somente os usuários não-root listados dentro dele podem agendar jobs at
. Se /etc/at.allow
não existir, mas /etc/at.deny
existir, somente os usuários não-root listados dentro dele não podem agendar job at
(neste caso, um arquivo /etc/at.deny
vazio indica que todos os usuários podem agendar jobs at
). Se nenhum desses arquivos existir, o acesso dos usuários ao agendamento de jobs at
depende da distribuição usada.
Especificações de tempo
Para especificar quando um job at
determinado deve ser executado, use o formato HH:MM
, seguido opcionalmente por AM ou PM no caso do formato de 12 horas. Se o momento especificado já tiver passado, a instrução é aplicada no dia seguinte. Para agendar uma data em particular para executar o job, é preciso adicionar as informações de data após a hora usando um dos formatos a seguir: nome-do-mês dia-do-mês
, nome-do-mês dia-do-mês ano
, MMDDYY
, MM/DD/YY
, DD.MM.YY
e YYYY-MM-DD
).
As palavras-chave a seguir também são aceitas: midnight
(meia-noite), noon
(meio-dia), teatime
(16h) e now
(agora), seguidas por um sinal de mais (+
) e um período de tempo (minutos, horas, dias e semanas). Finalmente, você pode dizer ao at
para executar o trabalho hoje ou amanhã adicionando as palavras today
ou tomorrow
à hora determinada. Assim, usaríamos at 07:15 AM Jan 01
para executar um trabalho às 07:15 da manhã de 1º de janeiro, e at now +5 minutes
para executar um job daqui a cinco minutos. Leia o arquivo timespec
na árvore /usr/share
para saber mais sobre a definição exata das especificações de data e hora.
Uma alternativa ao at
Usando o systemd como gerenciador de sistema e serviços, também é possível agendar tarefas únicas com o comando systemd-run
. Normalmente ele é usado para criar uma unidade transiente de temporizador para que um comando seja executado em um momento específico sem a necessidade de se criar um arquivo de serviço. Por exemplo, atuando como root, você pode executar o comando date
às 11h30 em 06/10/2019 usando o seguinte:
# systemd-run --on-calendar='2019-10-06 11:30' date
Se quiser executar o script foo.sh
, localizado em seu diretório atual, depois de dois minutos, use:
# systemd-run --on-active="2m" ./foo.sh
Consulte as páginas de manual para aprender todos os usos possíveis de systemd-run
com systemd-run(1)
.
Note
|
Os temporizadores são registrados no diário do systemd e você pode rever os registros das diferentes unidades usando o comando |
Exercícios Guiados
-
Para cada uma das seguintes especificações de tempo, indique qual é válida e qual é inválida para
at
:at 08:30 AM next week
at midday
at 01-01-2020 07:30 PM
at 21:50 01.01.20
at now +4 days
at 10:15 PM 31/03/2021
at tomorrow 08:30 AM
-
Depois de agendar um trabalho com
at
, como você pode rever seus comandos? -
Quais comandos você pode usar para rever seus jobs
at
pendentes? Quais comandos usaria para excluí-los? -
Com o systemd, qual comando é usado como alternativa a
at
?
Exercícios Exploratórios
-
Crie um job
at
que execute o scriptfoo.sh
, localizado em seu diretório inicial, às 10h30 do próximo dia 31 de outubro. Suponha que você esteja agindo como um usuário comum. -
Faça login no sistema como outro usuário comum e crie outro trabalho
at
que execute o scriptbar.sh
amanhã às 10:00. Suponha que o script está localizado no diretório inicial do usuário. -
Faça login no sistema como outro usuário comum e crie outro trabalho
at
que execute o scriptfoobar.sh
após 30 minutos. Suponha que o script está localizado no diretório inicial do usuário. -
Logado como root, execute o comando
atq
para listar os jobsat
programados de todos os usuários. O que acontece se um usuário comum executar esse comando? -
Como root, exclua todos esses jobs
at
pendentes usando um único comando. -
Como root, rode o comando
ls -l /usr/bin/at
e examine suas permissões.
Resumo
Nesta lição, você aprendeu:
-
Usar
at
para rodar jobs únicos em um momento específico. -
Gerenciar jobs
at
. -
Configurar o acesso dos usuários ao agendamento de jobs
at
. -
Usar o
systemd-run
como alternativa aoat
.
Os seguintes comandos e arquivos foram discutidos nesta lição:
at
-
Executa comandos em um momento especificado.
atq
-
Lista os trabalhos
at
pendentes do usuário, a menos que se trate do superusuário. atrm
-
Exclui trabalhos
at
, identificados por seu número de trabalho. /etc/at.allow
and/etc/at.deny
-
Arquivos particulares usados para definir restrições
at
. systemd-run
-
Cria e inicia uma unidade
timer
transiente como alternativa aoat
para agendamentos únicos.
Respostas aos Exercícios Guiados
-
Para cada uma das seguintes especificações de tempo, indique qual é válida e qual é inválida para
at
:at 08:30 AM next week
Válida
at midday
Inválida
at 01-01-2020 07:30 PM
Inválida
at 21:50 01.01.20
Válida
at now +4 days
Válida
at 10:15 PM 31/03/2021
Inválida
at tomorrow 08:30 AM monotonic
Inválida
-
Depois de agendar um trabalho com
at
, como você pode rever seus comandos?Use o comando
at -c
seguido pelo ID do trabalho cujos comandos deseja rever. Observe que a saída também contém a maior parte do ambiente que estava ativo no momento em que o job foi agendado. Lembre-se de que o root pode rever as tarefas de todos os usuários. -
Quais comandos você pode usar para rever seus jobs
at
pendentes? Quais comandos usaria para excluí-los?Use o comando
at -l
para rever os jobs pendentes e o comandoat -d
para excluir seus jobs.at -l
é um alias paraatq
eat -d
é um alias paraatrm
. O root pode listar e excluir jobs de todos os usuários. -
Com o systemd, qual comando é usado como alternativa a
at
?O comando
systemd-run
pode ser usado como uma alternativa aat
para agendar trabalhos únicos. Por exemplo, você pode usá-lo para executar comandos em um horário específico, definindo um temporizador de calendário ou um temporizador monotônico relativo a diferentes pontos de partida.
Respostas aos Exercícios Exploratórios
-
Crie um job
at
que execute o scriptfoo.sh
, localizado em seu diretório inicial, às 10h30 do próximo dia 31 de outubro. Suponha que você esteja agindo como um usuário comum.$ at 10:30 AM October 31 warning: commands will be executed using /bin/sh at> ./foo.sh at> Ctrl+D job 50 at Thu Oct 31 10:30:00 2019
-
Faça login no sistema como outro usuário comum e crie outro trabalho
at
que execute o scriptbar.sh
amanhã às 10:00. Suponha que o script está localizado no diretório inicial do usuário.$ at 10:00 AM tomorrow warning: commands will be executed using /bin/sh at> ./bar.sh at> Ctrl+D job 51 at Sun Oct 6 10:00:00 2019
-
Faça login no sistema como outro usuário comum e crie outro trabalho
at
que execute o scriptfoobar.sh
após 30 minutos. Suponha que o script está localizado no diretório inicial do usuário.$ at now +30 minutes warning: commands will be executed using /bin/sh at> ./foobar.sh at> Ctrl+D job 52 at Sat Oct 5 10:19:00 2019
-
Logado como root, execute o comando
atq
para listar os jobsat
programados de todos os usuários. O que acontece se um usuário comum executar esse comando?# atq 52 Sat Oct 5 10:19:00 2019 a dave 50 Thu Oct 31 10:30:00 2019 a frank 51 Sun Oct 6 10:00:00 2019 a emma
Se você executar o comando
atq
como root, todos os jobsat
pendentes de todos os usuários são listados. Se executá-lo como um usuário comum, apenas seus próprios jobsat
pendentes são listados. -
Como root, exclua todos esses jobs
at
pendentes usando um único comando.# atrm 50 51 52
-
Como root, rode o comando
ls -l /usr/bin/at
e examine suas permissões.# ls -l /usr/bin/at -rwsr-sr-x 1 daemon daemon 43762 Dec 1 2015 /usr/bin/at
Nesta distribuição, o comando
at
tem definidos os bits SUID (o caracteres
em vez do sinalizador executável para o proprietário) e SGID (o caracteres
em vez do sinalizador executável para o grupo), o que indica que é executado com os privilégios do proprietário e do grupo do arquivo (daemon
para ambos). É por isso que usuários comuns podem agendar tarefas comat
.