Como usar at e batch no Linux para programar comandos

Uma janela de terminal em um sistema Linux.
Fatmawati Achmad Zaenuri / Shutterstock

Se você quiser agendar um trabalho do Linux que vai acontecer apenas uma vez, croné um exagero. A atfamília de comandos é o que você precisa! E se você quiser executar processos apenas quando seu sistema tiver recursos livres, você pode usar batch.

Como agendar trabalhos Linux

O crondaemon mantém uma lista de tarefas que executa em horários específicos . Essas tarefas e programas são executados em segundo plano nos horários programados. Isso oferece grande flexibilidade para agendar tarefas que precisam ser repetidas. Se você precisa executar uma tarefa uma vez a cada hora, em um horário específico a cada dia ou uma vez por mês ou ano, você pode configurá-la em cron.

No entanto, isso não ajuda se você deseja agendar uma tarefa para ser executada apenas uma vez. Claro, você pode  configurá-lo nocron , mas então você deve se lembrar de voltar e remover a entrada do crontab  após a execução da tarefa, o que é inconveniente.

Com o Linux, se você está lutando com um problema, é quase garantido que outra pessoa também tenha lutado com ele. Felizmente, como os sistemas operacionais do tipo Unix existem há tanto tempo, também há uma excelente chance de alguém ter criado uma solução para o seu problema.

Para o problema descrito acima, eles têm, e é chamado at.

Instalando o at Command

Tivemos que instalar atno Ubuntu 18.04 e Manjaro 18.1.0 (já estava instalado no Fedora 31).

Para instalar atno Ubuntu, use este comando:

sudo apt-get install em

O comando "sudo apt-get install at" em uma janela de terminal.

Após a conclusão da instalação, você pode iniciar o atdaemon com este comando:

sudo systemctl enable --now atd.service

O comando "sudo systemctl enable --now atd.service" em uma janela de terminal.

No Manjaro, você instala atcom este comando:

sudo pacman -Si em

O comando "sudo pacman -Sy at" em uma janela de terminal.

Após a conclusão da instalação, digite este comando para iniciar o atdaemon:

sudo systemctl enable --now atd.service

O comando "sudo systemctl enable --now atd.service" em uma janela de terminal.

Em qualquer distribuição, você pode digitar este comando para garantir que o atddaemon esteja em execução:

ps -e | grep atd

O comando "ps -e | grep atd" em uma janela de terminal.

Como usar o comando at interativamente

Para usar at, você deve atribuir uma data e hora de execução. Há uma grande flexibilidade na maneira como você pode escrevê-los, que abordaremos mais adiante neste artigo.

No entanto, embora vamos usar de forma  atinterativa, você deve fornecer a data e a hora com antecedência. Se você não incluir nada na linha de comando ou digitar algo que não seja uma data e hora, at responderá com “Hora distorcida”, conforme mostrado abaixo:

em
na banana

Uso incorreto do comando "at" em uma janela de terminal.

Datas e horários podem ser explícitos ou relativos. Por exemplo, digamos que você queira que um comando seja executado daqui a um minuto. atsabe o que “agora” significa, então você pode usar nowe adicionar um minuto a ele, assim:

agora + 1 minuto

O comando "agora + 1 minuto" em uma janela de terminal.

atimprime uma mensagem e um atprompt e espera que você digite os comandos que deseja agendar. Primeiro, porém, considere a mensagem, conforme mostrado abaixo:

Recomendado:  Como colocar um alfinete no Google Maps em seu computador ou telefone

O prompt de comando "at" em uma janela de terminal.

Ele informa que você  at inicia uma instância do shshell e  executa os comandos dentro dela . Seus comandos não serão executados no shell Bash, que é compatível com o shshell, mas possui um conjunto de recursos mais rico.

Se seus comandos ou scripts tentarem usar uma função ou recurso que o Bash fornece, mas shnão oferece, eles falharão.

É fácil testar se seus comandos ou scripts serão executados sh. Use o shcomando para iniciar um shshell:

sh

O shell "sh" em uma janela de terminal.

O prompt de comando muda para um cifrão ( $) e agora você pode executar seus comandos e verificar se funcionam corretamente.

Para retornar ao shell Bash, digite o exitcomando:

Saída

Você não verá nenhuma saída padrão ou mensagens de erro dos comandos. Isso ocorre porque o shshell é iniciado como uma tarefa em segundo plano e é executado sem qualquer tipo de interface de tela.

Qualquer saída dos comandos – boa ou ruim – é enviada por e-mail para você. É enviado através do sistema de correio interno para quem executa o atcomando. Isso significa que você deve instalar e configurar esse sistema de e-mail interno.

Muitos (a maioria) sistemas Linux não têm um sistema de e-mail interno, pois raramente há necessidade de um. Aqueles que usam normalmente um sistema como  sendmail ou postfix . Se o seu sistema não tiver um sistema de e-mail interno, você pode ter scripts gravados em arquivos ou redirecionar a saída para arquivos para adicionar registro.

Se o comando não gerar nenhuma saída padrão ou mensagens de erro , você não receberá um e-mail de qualquer maneira. Muitos comandos do Linux indicam sucesso por meio do silêncio, portanto, na maioria dos casos, você não receberá um e-mail.

Agora, é hora de digitar um comando  at. Para este exemplo, vamos usar um pequeno arquivo de script chamado sweep.shque exclui os  *.bak, *.tmpe *.oarquivos. Digite o caminho para o comando, conforme mostrado abaixo, e pressione Enter.

O comando "~ / sweep.sh" em uma janela de terminal.

Outro prompt de comando é exibido e você pode adicionar quantos comandos desejar. Geralmente é mais conveniente ter seus comandos em um único script e simplesmente chamar esse script de dentro at.

Pressione Ctrl + D para informar at que terminou de adicionar comandos. atmostra <EOT>, que significa  fim da transmissão . Você é informado do número do trabalho e quando o trabalho está agendado para ser executado, conforme mostrado abaixo:

Confirmação da "tarefa 4" agendada para "Quarta-feira, 18 de dezembro 08:37:00 2019" em uma janela de terminal.

Depois que o trabalho for executado, digite o seguinte para verificar seu e-mail interno:

enviar

O comando "mail" em uma janela de terminal.

Se não houver correio, você deve assumir o sucesso. É claro que, neste caso, você pode verificar e ver se a  *.bak, *.tmpe *.oarquivos foram apagados para confirmar o comando funcionou.

Digite o seguinte para executar tudo novamente:

agora + 1 minuto

O comando "agora + 1 minuto" em uma janela de terminal.

Após um minuto, digite o seguinte para verificar novamente seu e-mail:

enviar

O comando "mail" indicando "1 mensagem 1 não lida" em uma janela de terminal.

Ei, temos e-mail! Para ler a mensagem número um, pressione 1 e depois pressione Enter.

Um e-mail interno em uma janela de terminal.

Recebemos um e-mail de atporque os comandos no script geraram mensagens de erro. Neste exemplo, não havia arquivos para excluir porque quando executamos o script anteriormente, ele os removeu.

Pressione D + Enter para excluir o e-mail e Q + Enter para sair do programa de e-mail.

Formatos de data e hora

Você tem muita flexibilidade quando se trata dos formatos de hora com os quais pode usar at. Aqui estão alguns exemplos:

  • Executar às 11:00:
    • às 11:00
  • Executar amanhã às 11h:
    • amanhã às 11:00
  • Executar às 11h neste dia da próxima semana:
    • às 11:00 da próxima semana
  • Execute a esta hora, neste dia, na próxima semana:
    • na próxima semana
  • Executar às 11h na próxima sexta-feira:
    • às 11:00 da próxima sexta
  • Executar a esta hora na próxima sexta-feira:
    • na próxima sexta
  • Executar às 11h nesta data, no próximo mês:
    • às 11:00 no próximo mês
  • Executar às 11h em uma data específica:
    • às 11:00 AM 15/03/2020
  • Corra daqui a 30 minutos:
    • agora + 30 minutos
  • Execute duas horas a partir de agora:
    • agora + 2 horas
  • Corra a esta hora amanhã:
    • amanhã
  • Executar a esta hora na quinta-feira:
    • na quinta feira
  • Executar à meia-noite:
    • à meia-noite
  • Executar às 12h:
    • ao meio-dia
  • Se você é britânico, pode até programar um comando para ser executado na hora do chá (16h):
    • na hora do chá

Olhando para a fila de tarefas

Você pode digitar o atqcomando para ver a fila de trabalhos agendados, conforme mostrado abaixo.

Recomendado:  Qual é a diferença entre clareza e textura no Adobe Photoshop Lightroom?

Saída do comando "atq" mostrando 5 tarefas em uma janela de terminal.

Para cada comando na fila, atqexibe as seguintes informações:

  • ID de trabalho
  • Data marcada
  • Hora marcada
  • Coloque o trabalho na fila . As filas são rotuladas como “a”, “b” e assim por diante. As tarefas normais que você programa atvão para a fila “a”, enquanto as tarefas que você programa batch (abordadas posteriormente neste artigo) vão para a fila “b”
  • A pessoa que programou o trabalho.

Usando at na linha de comando

Você não precisa usar atinterativamente; você também pode usá-lo no comando. Isso torna mais fácil usar dentro dos scripts.

Você pode canalizar comandos para at, assim:

echo "sh ~ / sweep.sh" | às 08:45

Um comando "echo" sh ~ / sweep.sh "| às 08:45" em uma janela de terminal.

O trabalho é aceito e agendado por at, e o número do trabalho e a data de execução são relatados como antes.

Usando at com Arquivos de Comandos

Você também pode armazenar uma sequência de comandos em um arquivo e depois passá-la para at. Pode ser um arquivo de texto simples de comandos – não precisa ser um script executável.

Você pode usar a -fopção (arquivo) da seguinte maneira para passar um nome de arquivo para at:

agora + 5 minutos -f clean.txt

Um comando "agora + 5 minutos -f clean.txt" em uma janela de terminal.

Você pode obter o mesmo resultado se redirecionar o arquivo para at:

agora + 5 minutos <clean.txt

Um comando "agora + 5 minutos <clean.txt" em uma janela de terminal.

Removendo trabalhos programados da fila

Para remover um trabalho agendado da fila, você pode usar o atrmcomando. Se quiser ver a fila primeiro para encontrar o número do trabalho que deseja remover, você pode usar atq . Em seguida, use esse número de trabalho com atrm, conforme mostrado abaixo:

atq
atrm 11
atq

Removendo o job 11 da fila at em uma janela de terminal.

Como ver uma visão detalhada das tarefas

Como mencionamos anteriormente, você pode agendar trabalhos em um futuro distante. Às vezes, você pode esquecer o que um trabalho vai fazer. O atqcomando mostra os trabalhos na fila, mas não o que eles farão. Se quiser ter uma visão detalhada de um trabalho, você pode usar a -copção (cat).

Primeiro, usaremos atqpara encontrar o número do trabalho:

atq

Saída do comando "atq" em uma janela de terminal.

Agora, usaremos o trabalho número 13 com a -copção:

em -c 13

O comando "at -c 13" e a saída em uma janela de terminal.

Aqui está um detalhamento das informações que recebemos sobre o trabalho:

  • Primeira linha: Isso nos diz que os comandos serão executados no shshell.
  • Segunda linha:  vemos que os comandos serão executados com ID de usuário e grupo de 1000. Esses são os valores para a pessoa que executou o atcomando.
  • Terceira linha:  A pessoa que recebe os e-mails  atenvia.
  • Quarta linha:  A máscara do usuário é 22. Esta é a máscara usada para definir as permissões padrão para qualquer arquivo criado nesta shsessão. A máscara é subtraída de 666, o que nos dá 644 (o equivalente octal de rw-r--r--).
  • Dados restantes:  a maioria são variáveis ​​de ambiente.
Recomendado:  O que é a Lightning Network do Bitcoin e como você a usa?

Saída do comando "-c 13" em uma janela de terminal.

  • Resultados de um teste.  Um teste verifica se o diretório de execução pode ser acessado. Se não puder, um erro será gerado e a execução do job será abandonada.
  • Os comandos a serem executados.  Eles são listados e o conteúdo dos scripts que estão programados é exibido. Observe que embora o script em nosso exemplo acima tenha sido escrito para ser executado no Bash, ele ainda será executado em um shshell.

O comando batch

O batchcomando opera de forma semelhante ao atcomando, mas com três diferenças significativas:

  1. Você só pode usar o batchcomando interativamente.
  2. Em vez de programar trabalhos para execução em um horário específico, você os adiciona à fila e o batchcomando os executa quando a carga média do sistema  é inferior a 1,5.
  3. Devido ao acima exposto, você nunca especifica uma data e hora com o batchcomando.

Ao usar o batchcomando, você o chama pelo nome, sem parâmetros de linha de comando, como:

lote

O comando "batch" em uma janela de terminal.

Em seguida, adicione tarefas como faria com o atcomando.

Controlando o acesso ao comando at

Os arquivos at.allowe at.denycontrolam quem pode usar a atfamília de comandos. Eles estão localizados no /etcdiretório. Por padrão, apenas o at.denyarquivo existe e é criado quando até instalado.

Veja como funcionam:

  • at.deny: Lista os aplicativos e entidades que não podem ser usados atpara agendar trabalhos.
  • at.allow: Listas que podem usar  atpara agendar trabalhos. Se o at.allowarquivo não existir, atuse apenas o at.denyarquivo.

Por padrão, qualquer pessoa pode usar at. Se você quiser restringir quem pode usá-lo, use o at.allowarquivo para listar quem pode. Isso é mais fácil do que adicionar atao at.denyarquivo todas as pessoas que não podem usar .

Esta é a at.denyaparência do arquivo:

sudo menos /etc/at.deny

O comando "sudo less /etc/at.deny" em uma janela de terminal.

O arquivo lista os componentes do sistema operacional que não podem ser usados at. Muitos deles são impedidos de fazer isso por motivos de segurança, portanto, você não deseja remover nenhum do arquivo.

O conteúdo do arquivo at.deny em uma janela de terminal.

Agora, vamos editar o at.allowarquivo. Vamos adicionar  davee mary, mas ninguém mais terá permissão para usar at.

Primeiro, digitamos o seguinte:

sudo gedit /etc/at.allow

O comando "sudo gedit /etc/at.allow" em uma janela de terminal.

No editor, adicionamos os dois nomes, conforme mostrado abaixo, e então salvamos o arquivo.

"dave" e "mary" adicionados ao gedit.

Se alguém tentar usar at, será informado de que não tem permissão. Por exemplo, digamos que um usuário denominado ericdigite o seguinte:

em

Ele seria recusado, conforme mostrado abaixo.

"eric" não tem permissão para usar "at" em uma janela de terminal.

Novamente, ericnão está no at.denyarquivo. Assim que você colocar qualquer pessoa no at.allowarquivo, qualquer pessoa terá a permissão de uso negada at.

Ótimo para One-Offs

Como você pode ver, ambos  atbatchsão ideais para tarefas que você só precisa executar uma vez. Novamente, como uma revisão rápida:

  • Quando você precisar fazer algo que não seja um processo normal, agende-o com at.
  • Se você deseja executar uma tarefa apenas quando a carga do sistema estiver baixa o suficiente, use batch.