Se você deseja agendar um trabalho do Linux que acontecerá apenas uma vez, o cron é um exagero. A família de comandos at é o que você precisa! E se você quiser executar processos apenas quando seu sistema tiver recursos livres, você pode usar batch.
últimas postagens
Como agendar trabalhos no Linux
O cron daemon 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á-lo no cron.
No entanto, isso não ajuda se você quiser agendar uma tarefa para ser executada apenas uma vez. Claro, você pode configurá-lo no cron, mas então você deve se lembrar de voltar e remover o entrada 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 em.
Instalando o at Command
Tivemos que instalar em no Ubuntu 18.04 e no Manjaro 18.1.0 (já estava instalado no Fedora 31).
Para instalar no Ubuntu, use este comando:
sudo apt-get install at
Após a conclusão da instalação, você pode iniciar o daemon at com este comando:
sudo systemctl enable --now atd.service
No Manjaro, você instala em com este comando:
sudo pacman -Sy at
Após a conclusão da instalação, digite este comando para iniciar o daemon at:
sudo systemctl enable --now atd.service
Em qualquer distribuição, você pode digitar este comando para garantir que o daemon atd esteja em execução:
ps -e | grep atd
Como usar o comando at interativamente
Para usar em, você deve atribuir a ele uma data e hora de execução. Há uma grande flexibilidade na maneira como você pode escrevê-los, que abordaremos posteriormente neste artigo.
No entanto, mesmo que usemos em interativamente, 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 responde com “Hora distorcida”, conforme mostrado abaixo:
at
at banana
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. at sabe o que “agora” significa, então você pode usar agora e adicionar um minuto a ele, assim:
at now + 1 minute
at imprime uma mensagem e um prompt at e espera que você digite os comandos que deseja agendar. Porém, primeiro considere a mensagem, conforme mostrado abaixo:
Ele diz a você ao iniciar uma instância do shell sh e execute os comandos dentro disso. Seus comandos não serão executados no shell Bash, que é compatível com o shell sh, mas possui um conjunto de recursos mais rico.
Se seus comandos ou scripts tentarem usar uma função ou recurso que o Bash oferece, mas sh não o faz, eles falharão.
É fácil testar se seus comandos ou scripts serão executados em sh. Use o comando sh para iniciar um sh shell:
sh
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 comando exit:
exit
Você não verá nenhuma saída padrão ou mensagens de erro dos comandos. Isso ocorre porque o sh shell é iniciado como uma tarefa em segundo plano e é executado sem qualquer tipo de interface de tela.
Qualquer saída dos comandos – bons ou ruins – é enviada por e-mail para você. É enviado através do sistema de correio interno para quem executa o comando at. 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 normalmente usam um sistema como enviar correio 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 o 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 em. Para este exemplo, usaremos um pequeno arquivo de script chamado sweep.sh que exclui os arquivos * .bak, * .tmp e * .o. Digite o caminho para o comando, conforme mostrado abaixo, e pressione Enter.
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 em.
Pressione Ctrl + D para saber quando você terminou de adicionar comandos. em shows
Após a execução da tarefa, digite o seguinte para verificar seu e-mail interno:
Se não houver correio, você deve presumir que foi bem-sucedido. Claro, neste caso, você pode verificar se os arquivos * .bak, * .tmp e * .o foram excluídos para confirmar se o comando funcionou.
Digite o seguinte para executar tudo novamente:
at now + 1 minute
Após um minuto, digite o seguinte para verificar novamente o seu e-mail:
Ei, temos e-mail! Para ler a mensagem número um, pressione 1 e, em seguida, pressione Enter.
Recebemos um e-mail de em porque 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 no que diz respeito aos formatos de hora que pode usar em. Aqui estão alguns exemplos:
Executar às 11h:
at 11:00 AM
Amanhã às 11h00:
at 11:00 AM tomorrow
Executar às 11h neste dia da próxima semana:
at 11:00 AM next week
Execute a esta hora, neste dia, na próxima semana:
at next week
Executar às 11h na próxima sexta-feira:
at 11:00 AM next fri
Executar a esta hora na próxima sexta-feira:
at next fri
Executar às 11h nesta data, no próximo mês:
at 11:00 AM next month
Executar às 11h em uma data específica:
at 11:00 AM 3/15/2020
Corra daqui a 30 minutos:
at now + 30 minutes
Execute duas horas a partir de agora:
at now + 2 hours
Amanhã a esta hora:
at tomorrow
Executar a esta hora na quinta-feira:
at thursday
Executar à meia-noite:
at midnight
Executar às 12h:
at noon
Se você é britânico, pode até programar um comando para ser executado na hora do chá (16h):
at teatime
Olhando para a fila de tarefas
Você pode digitar o comando atq para ver a fila de trabalhos agendados, conforme mostrado abaixo.
Para cada comando na fila, atq exibe 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 com vão para a fila “a”, enquanto as tarefas que você programa com lote (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 tem que usar a interativamente; você também pode usá-lo no comando. Isso torna mais fácil usar dentro dos scripts.
Você pode canalizar comandos para at, como este:
echo "sh ~/sweep.sh" | at 08:45 AM
O trabalho é aceito e agendado por às, 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 às. Pode ser um arquivo de texto simples de comandos – não precisa ser um script executável.
Você pode usar a opção -f (arquivo) da seguinte maneira para passar um nome de arquivo para em:
at now + 5 minutes -f clean.txt
Você pode obter o mesmo resultado se redirecionar o arquivo para em:
at now + 5 minutesRemoving Scheduled Jobs from the Queue
To remove a scheduled job from the queue, you can use the atrm command. If you want to see the queue first to find the number of the job you want to remove, you can use atq . Then, use that job number with atrm, as shown below:
atqatrm 11atqComo 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 comando atq 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 opção -c (cat).
Primeiro, usaremos atq para encontrar o número do trabalho:
atqAgora, usaremos o trabalho número 13 com a opção -c:
at -c 13Aqui está um detalhamento das informações que recebemos sobre o trabalho:
Primeira linha: Isso nos diz que os comandos serão executados no shell sh.
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 comando at.
Terceira linha: a pessoa que recebe os e-mails nos envios.
Quarta linha: o Máscara de usuário é 22. Esta é a máscara usada para definir as permissões padrão para quaisquer arquivos criados nesta sessão sh. 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.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 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 shell sh.O comando batch
O comando batch opera de forma semelhante para o comando, mas com três diferenças significativas:
Você só pode usar o comando batch interativamente.
Em vez de programar trabalhos para execução em um horário específico, você os adiciona à fila e o comando batch os executa quando a carga média do sistema é inferior a 1,5.
Devido ao acima exposto, você nunca especifica uma data e hora com o comando batch.Ao usar o comando batch, você o chama pelo nome, sem parâmetros de linha de comando, como:
batchEm seguida, adicione tarefas como faria com o comando at.
Controlando o acesso ao comando at
Os arquivos at.allow e at.deny controlam quem pode usar a família de comandos at. Eles estão localizados no diretório / etc. Por padrão, apenas o arquivo at.deny existe e é criado quando o at é instalado.
Veja como funcionam:
at.deny: Lista os aplicativos e entidades que não podem ser usados em para agendar trabalhos.
at.allow: Lista quem pode usar at para agendar trabalhos. Se o arquivo at.allow não existir, a at usará apenas o arquivo at.deny.Por padrão, qualquer pessoa pode usar em. Se você quiser restringir quem pode usá-lo, use o arquivo at.allow para listar quem pode. Isso é mais fácil do que adicionar todos que não podem usar at ao arquivo at.deny.
Esta é a aparência do arquivo at.deny:
sudo less /etc/at.denyO arquivo lista os componentes do sistema operacional que não podem ser usados em. Muitos deles são impedidos de fazer isso por motivos de segurança, portanto, você não deseja remover nenhum do arquivo.
Agora, vamos editar o arquivo at.allow. Vamos adicionar dave e mary, mas ninguém mais terá permissão para usar em.
Primeiro, digitamos o seguinte:
sudo gedit /etc/at.allowNo editor, adicionamos os dois nomes, conforme mostrado abaixo, e depois salvamos o arquivo.
Se alguém tentar usar em, será informado de que não tem permissão. Por exemplo, digamos que um usuário chamado eric digite o seguinte:
atEle seria recusado, conforme mostrado abaixo.
Novamente, eric não está no arquivo at.deny. Assim que você colocar qualquer pessoa no arquivo at.allow, qualquer pessoa terá a permissão negada para usar em.
Ótimo para One-Offs
Como você pode ver, at e batch sã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 é um processo normal, agende-o com em.
Se você quiser executar uma tarefa apenas quando a carga do sistema estiver baixa o suficiente, use batch.