Como agendar tarefas no Linux para quando a máquina ficar ociosa.

Se você quiser rodar programas ou agendar atividades para horários opostos aos de pico do sistema, ou seja, quando estiver (razoavelmente) ocioso, o comando batch é a solução.
Tarefas agendadas através deste utilitários serão executadas automaticamente quando a média da carga de trabalho do sistema estiver abaixo de 0.8 — no meu sistema (Debian 9.0 Stretch o valor padrão é 1.5.
É possível ajustar este número no atd ou no atrun, se ele não for satisfatório.
Use man, combinado com o comando grep, para saber qual o valor no seu sistema:


man batch | grep -i average

               other  words,  when the load average drops below 1.5,
       processing rules with respect to load average apply.  If  atq

O batch faz parte do pacote do comando at — clique para obter mais detalhes.
Você pode restringir acesso ao at e ao batch, inscrevendo os nomes de usuários no arquivo /etc/at.deny.
Para alterar o valor referente à carga média de trabalho do sistema, abaixo do qual o batch já pode começar a executar as tarefas listadas, use o comando atd:

atd -l x

Substitua x pelo valor desejado.
Este comando necessita de privilégios administrativos.
Ao rodar o comando batch, ele entrará no modo prompt, pedindo para que você forneça tarefas a serem executadas, uma por linha.
Ao terminar de listar os comandos, tecle ‘Ctrl + D’ (^D).


batch

warning: commands will be executed using /bin/sh
at> espeak -v pt "Estou ocioso, no momento, patrão!"
at> espeak -v pt "Me dê algo para fazer."
at> ^D 
job 20 at Thu Sep 14 15:22:00 2017

Esta é a maneira de rodar o comando. Ele não aceita parâmetros, como o comando at.

Referências

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/3/html/System_Administration_Guide/s1-autotasks-at-batch.html.

http://www.tutorialspoint.com/unix_commands/batch.htm

https://kb.iu.edu/d/aewo.

Use o comando at para agendar tarefas no Linux

O Cron não é a única maneira de agendar atividades no Linux.
O comando at permite agendar rapidamente uma tarefa, sem a necessidade de editar a tabela do crontab.


Se tiver interesse, leia mais sobre o cron.
Se precisa definir rapidamente um momento para o sistema realizar uma tarefa, o comando at é uma boa alternativa.
Infelizmente, em alguns sistemas, o comando não vem instalado por padrão — o que pode impossibilitar seu uso em servidores aos quais você não tem acesso com privilégios administrativos, para fazer novas instalações (como o seu provedor de hospedagem, por exemplo).
Para instalar no Debian (ou em outras distribuições baseadas nela), use o apt:

sudo apt install at

O pacote inclui os utilitarios at, batch, atq, atrm — para enfileirar comandos, examinar e/ou apagar tarefas agendadas etc.
Veja um exemplo simples de execução, com o uso do comando history:


at now

warning: commands will be executed using /bin/sh
at> history
at> 
job 4 at Thu Sep 14 10:44:00 2017

Neste caso, o comando será executado imediatamente (now), tão logo termine a edição do at.
Você pode inserir vários comandos Linux, um a cada linha.
Quando terminar de enfileirar linhas de comando, tecle Ctrl + D (^D), para finalizar.
Para agendar um comando para execução daqui a dois minutos:


at now + 2 min

warning: commands will be executed using /bin/sh
at> espeak -v pt "O tempo de dois minutos acabou de expirar, capitão!"
at> ^D 
job 9 at Thu Sep 14 10:54:00 2017

Veja como agendar backup de um diretório para daqui a 3 minutos:


at now + 3 min

warning: commands will be executed using /bin/sh
at> espeak -v pt "Iniciando o backup do diretório de scripts"
at> tar cvzf backup.tz scripts/
at> espeak -v pt "o backup foi finalizado."
at> 
job 12 at Thu Sep 14 11:01:00 2017

Outras formas de agendamento de tarefas com o comando at, no Linux

Há outras maneiras de agendar tarefas com o comando at, que permitem maior flexibilidade na escolha do momento da execução.
Veja alguns exemplos, que podem ser readequados ao seu caso:

  • at 11:08 AM September 14 2017 — Agende a execução da tarefa para uma data e hora específicas. Neste caso: 11:08, 14 de Setembro de 2017.
  • at now + 1 hours — Execução agendada para daqui a duas horas.
  • at now +24 hours — agendamento para o dia seguinte, nesta mesma hora.
  • at 8:00 PM tomorrow — agendamento para amanhã (tomorrow), 8h da noite.
  • at now + 2 years — agendamento para daqui a 2 anos.

Quando o comando não consegue “entender” a hora/data oferecida, ele vai retornar a mensagem “Garbled time!“.
Há outras formas de especificar hora e data, para falantes da língua inglesa. Veja alguns exemplos:

  • noon — meio dia.
  • midnight — meia noite.
  • tomorrow — se especificado sozinho, o at já sabe que você se refere a hora atual, sé que amanhã.
  • noon tomorrow — amanhã, meio dia.
  • next week — próxima semana.
  • next month — próximo mês.
  • next friday — próxima sexta-feira.
  • now + 3 weeks — daqui a 3 semanas, neste mesmo horário.
  • AUG — em Agosto, nesta mesma data e hora.

Como verificar as tarefas agendadas no sistema

Você verificar os trabalhos enfileirados com a opção ‘-l’ ou com o comando atq:


at -l

14  Thu Sep 14 13:09:00 2017 a justincase
16  Thu Sep 14 11:17:00 2017 a justincase

O número exibido na primeira coluna é a ID de cada tarefa agendada.
O comando atq e suas variantes, só irá listar as tarefas do seu usuário.
Para obter informações sobre todos os usuários no sistema, rode o comando com privilégios de superusuário.

Como cancelar uma tarefa

Você pode indicar a ID de um item, que ainda não foi executado, para cancelamento, com o comando atrm ou com uma das opções ‘-r’ ou ‘-d’:


at -r 14

Como agendar uma lista de comandos dentro de um arquivo

Você pode listar todas as tarefas que deseja executar, uma por linha, dentro de um arquivo texto.
Em seguida, por entregar o arquivo para o at.
Veja o meu arquivo:


cat comandos.txt 

whiptail --backtitle "Importante!"  --title "mensagem" --msgbox "minha linda mensagem" 7 30

espeak -v pt "Por favor, dê atenção a esta importante mensagem."

Para fazer com que o at execute estas tarefas, use a opção ‘-f’:


at -f comandos.txt now

Referências

https://unix.stackexchange.com/questions/97882/why-do-we-need-the-at-command-in-linux.

https://www.computerhope.com/unix/uat.htm.

Como usar o comando Crontab – o cron para novatos.

Este post tem a pretensão de dar uma rápida introdução ao cron — e cobrir o básico de tudo o que ele é capaz de fazer para você.

O que é o cron?

Cron é o nome do programa que permite aos usuários do Unix/Linux executar comandos ou scripts (grupos de comandos) automaticamente em um determinado horário/data.

É comumente usado pelos administradores de sistemas para programar a execução de suas tarefas administrativas – como o backup.

Vamos ver, aqui, como funciona o Cron Vixie, uma versão desenvolvida por Paul Vixie.

Como iniciar o cron

Patek Philipecron é um daemon, o que significa que ele é um serviço que é iniciado uma vez (usualmente, quando o sistema é ligado), entra em stand by e, na hora certa, executa a(s) tarefa(s) programada(s) – usualmente, em background, ou seja, nos bastidores do sistema.

Outro exemplo de daemon é o servidor FTP, que fica em stand by, quando não está sendo usado.

O daemon crond já vem instalado na maioria das distros Linux e costuma ter algumas tarefas corriqueiras, já agendadas, como padrão.

Se você quiser saber o estado do seu crond, rode o seguinte comando:

ps aux | grep crond

O meu resultado foi este:

root 311 0.0 0.7 1284 112 ? S Dec24 0:00 crond

2914659 20624 0.0 0.0 112364 856 pts/1 SN+ 12:49 0:00 grep crond

A primeira linha, indica que o crond está sendo executado no meu sistema.

Se ele não estiver rodando no seu sistema, ou ele foi desligado (por você ou outro usuário) ou apenas nem foi iniciado.

Para iniciá-lo, você pode adicionar a linha crond a um dos scripts de inicialização ou rodar o aplicativo manualmente, como root:

crond

como usar o cron

Dentro do diretório /etc/, é possível encontrar subdiretórios chamados cron.hourly/, cron.weekly/, cron.daily/, cron.monthly/. O princípio é simples, assim – ao copiar um script para dentro de um destes diretórios, ele será executado a cada hora (hourly), a cada semana(weekly), a cada mês (monthly). A frequência com que o script será executado, depende do nome do diretório, portanto.

É possível ter mais flexibilidade no modo como a tarefa será executada, através da edição do arquivo /etc/crontab. Em um típico servidor Debian, este arquivo tem a seguinte aparência:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin</p>
<p># m h dom mon dow user	command
17 *	* * *	root    cd / &amp;&amp; run-parts --report /etc/cron.hourly
25 6	* * *	root	test -x /usr/sbin/anacron || ( cd / &amp;&amp; run-parts --report /etc/cron.daily )
47 6	* * 7	root	test -x /usr/sbin/anacron || ( cd / &amp;&amp; run-parts --report /etc/cron.weekly )
52 6	1 * *	root	test -x /usr/sbin/anacron || ( cd / &amp;&amp; run-parts --report /etc/cron.monthly )
#

Você pode verificar o arquivo, no seu sistema, com o seguinte comando:

cat /etc/crontab

explicando o arquivo crontab

As primeiras linhas, do arquivo, definem algumas variáveis usadas pelo cron. A segunda parte é a que exige um pouco mais de atenção. Vamos usar tabela para explicar a linha

# m h dom mon dow user	command
Item Descrição
m ou minute minuto – determina a quantos minutos, dentro de uma hora, o comando será executado. Os valores aceitos vão de 0 a 59.
h ou hour hora – determina a que hora o comando será executado e sua especificação segue o padrão 24h. Portanto, aceita valores entre 0 e 23 (sendo que 0 é meia-noite).
dom ou day of month dia do mês – determina o dia do mês em que o comando será executado. Se quiser que a tarefa seja executada no dia 25 do mês, use o valor 25.
mon ou month mês – determina o mês em que o comando será executado. Aceita tanto valores numéricos referentes aos meses do ano, como alfabéticos (e. g. August).
dow ou day of week dia da semana – aceita tanto valores numéricos de 0 a 7, como caracteres: sun, mon, tue, wed, thu, fri e sat, que correspondem, respectivamente a domingo, segunda, terça, quarta, quinta, sexta e sábado.
user usuário – determina o usuário do sistema sob cujos privilégios o comando irá ser executado
cmd ou command comando – determina o comando a ser executado.

Notas:

  • Nos campos em que você não deseja fixar valor algum, pode inserir um asterisco ‘*’.
  • No campo dow, dia da semana, tanto 0 como 7 correspondem a domingo
  • Caso você determine valores para dom e para dow, o sistema não entra em conflito. O cron executa o comando nos dois casos
  • O Vixie Cron aceita listas. O que significa que você pode enumerar especificamente, por exemplo, os dias da semana em que você deseja que um script seja disparado. Veja um exemplo:
    59 11 * * 1,2,3,4,5 root backup.sh

    irá executar o script backup.sh toda segunda, terça, quarta, quinta e sexta, às 11:59

  • Se você preferir, pode usar assim:
    59 11 * * 1-5 root backup.sh

    onde 1 – 5 significa de segunda a sexta

  • Você também pode “pular” números. Veja como:
  • se você usar o valor */2 no campo dom, o comando irá rodar a cada 2 dias.
  • */5, no campo de horas, fará com que o comando seja executado a cada 5 horas
  • Os nomes dos meses e dos dias da semana não são sensíveis à caixa. Ou seja, tanto faz escrever Jul como jul. O importante é que você use apenas as 3 primeiras letras do dia da semana ou do nome do mês.
  • Você pode (e deve) inserir comentários para explicar o que está fazendo. Para isto, basta usar um ‘#’ no início da linha comentada.

O crontab é multiusuário

O Unix é um sistema, por natureza, multiusuário. Cada usuário que se conecta ao sistema pode, em tese, programar as próprias tarefas a serem executadas pelo sistema.

Assim, você, que tem um blog WordPress instalado em um servidor – que te forneça acesso SSH – pode programar um backup e determinar a frequência com que ele irá ocorrer.

Para começar a personalizar o seu próprio crontab, use o comando:

crontab -e

O sistema irá abrir o seu editor de textos padrão (o meu é o nano).

Se você quiser usar o nano também, para editar o crontab execute o seguinte comando:

export EDITOR=nano

Note que o seu crontab “particular” segue os padrões do arquivo /etc/crontab do sistema.

Uma vez terminada a edição, o cron faz a verificação sintática e permite corrigir possíveis erros. Se tudo estiver bem, é só deixar rolar.

Outros editores de texto

Usuários que se sintam mais confortáveis com outros editores de texto, podem faze a edição no aplicativo da sua preferência.

Depois de concluído, é só usar o comando crontab para substituir o seu arquivo crontab atual pelo arquivo que você acabou de criar.

Vamos supor que você tenha escrito as definições em um arquivo chamado meu.arquivo.cron, o comando a ser usado é o seguinte:

crontab meu.arquivo.cron

Outros usos

Para listar as definições atuais do crontab:

crontab -l

Para apagar e remover o seu crontab atual:

crontab -r

Como restringir acesso ao crontab

Quem é administrador de um sistema pode impedir que usuários tenham acesso ao cron. Você pode inserir, no arquivo /etc/cron.allow os usuários que têm permissão de alterar o crontab. O arquivo /etc/cron.deny é onde são inscritos os usuários que terão seu acesso negado ao serviço.

Uma maneira de restringir quase todos e permitir o acesso a alguns é adicionar a linha ALL ao /etc/cron.deny e ir acrescentando um a um os usuários aos quais você deseja liberar o acesso em /etc/cron.allow.

Veja como restringir o acesso de todo mundo ao serviço:

echo ALL &gt;&gt; /etc/cron.deny

Para permitir o acesso à usuária sandrinha, use o comando:

echo sandrinha &gt;&gt; /etc/cron.allow

Na ausência de qualquer um destes dois arquivos, o uso do cron, no sistema, é irrestrito — ou seja, todo mundo pode usar.

Se você tiver apenas o arquivo /etc/cron.allow e, nele, inscrever a usuária sandrinha, o sistema vai entender que todos os outros usuários estão proibidos e somente esta poderá fazer uso do serviço.

Com estas dicas básicas, você já estará habilitado a administrar as tarefas programadas no seu sistema. Mais informações podem ser encontradas com o comando man crontab.

Have fun!