Você está na página 1de 9

Agendando Tarefas no ESXi Usando Cron – vswitchzero https://vswitchzero-com.translate.goog/2021/02/17/scheduling-tasks-in-...

Agendando Tarefas no ESXi Usando


Cron

O utilitário “cron” é um agendador de tarefas em sistemas operacionais baseados


em Linux/Unix. É muito útil para agendar scripts ou comandos especí�cos para
serem executados em um cronograma de�nido – diariamente, semanalmente,
mensalmente e tudo mais. Felizmente, o ESXi inclui uma implementação do
utilitário cron que pode ser acessado a partir do shell raiz. Normalmente, você não
precisaria usar o cron, mas há algumas situações em que o agendamento de
comandos da CLI pode ser útil.

Alguns casos de uso em que �z isso pessoalmente ao longo dos anos incluem:

• Para coletar estatísticas de switchport em determinados horários durante a


noite para solucionar problemas de perda de pacotes ou problemas de
desempenho.
• Reiniciar um serviço especí�co a cada 24 horas para evitar que um vazamento
de memória �que fora de controle.
• Executar um script python ou shell para coletar vários dados da CLI.

A implementação do cron do ESXi é semelhante à da maioria das distribuições


Linux, mas não é exatamente a mesma. O popular comando 'crontab' não está
incluído e não pode ser usado para adicionar tarefas facilmente. Além disso,
quaisquer alterações feitas no cron não terão efeito até que o serviço crond seja
reiniciado.

Preparação

1 of 9 04/12/2022 15:17
Agendando Tarefas no ESXi Usando Cron – vswitchzero https://vswitchzero-com.translate.goog/2021/02/17/scheduling-tasks-in-...

Antes de alterar a con�guração do cron, você deve testar o comando ou script que
planeja agendar. No meu caso, vou simplesmente executar um comando esxcli a
cada dois minutos que adicionará uma entrada de marca aos arquivos de log do
sistema:

[root@esx1:~] esxcli system syslog mark --message="Meu cron job acabou de


rodar!"

[root@esx1:~] cat /var/log/vmkernel.log |grep "mark:"


2021-02-17T17:39:00Z esxcfg-syslog[2102126]: mark: My cron job just run!

Como você pode ver acima, esta é uma ótima maneira de testar o cron, porque
toda vez que ele for executado, você obterá uma prova no registro junto com um
carimbo de data/hora.

Dica: Se você estiver adicionando um script ao seu host, evite o local


/tmp, pois ele não é persistente nas reinicializações. Eu gosto de usar
/opt em versões mais antigas ou a partição OSData no ESXi 7.0.

Além disso, se você não estiver familiarizado com a formatação do crontab,


recomendo ler sobre o assunto para garantir que seus trabalhos sejam executados
conforme o esperado. Há uma série de bons recursos online que mostram as várias
opções de agendamento. Também incluí alguns exemplos no �nal deste post.

Adicionando um trabalho cron

2 of 9 04/12/2022 15:17
Agendando Tarefas no ESXi Usando Cron – vswitchzero https://vswitchzero-com.translate.goog/2021/02/17/scheduling-tasks-in-...

Primeiro, você precisará fazer o SSH em seu host ESXi. Uma vez lá, você pode ver o
arquivo crontab atual em /var/spool/cron/crontabs/root. No ESXi 7.0, o arquivo
contém:

[root@esx1:~] cat /var/spool/cron/crontabs/root


#min hora dia mon comando dow
1 1 * * * /sbin/tmpwatch.py
1 * * * * /sbin/auto-backup.sh
0 * * * * /usr/lib/vmware/vmksummary/log-heartbeat.py
*/5 * * * * /bin/hostd-probe.sh ++group=host/vim/vmvisor/hostd-
probe/stats/sh
00 1 * * * localcli storage core device purge
*/10 * * * * /bin/crx-cli gc
*/2 * * * * esxcli system syslog mark --message="Meu cron job acabou de
rodar!"

Como você pode ver, o ESXi já usa o cron para agendar várias rotinas internas de
limpeza. Antes de alterar o arquivo, certi�que-se de fazer backup apenas no caso:

cp /var/spool/cron/crontabs/root /var/spool/cron/crontabs/root.old

Você pode modi�car o arquivo usando 'vi'. Para aqueles que não estão
familiarizados com o Linux, há um pouco de curva de aprendizado no vi, então eu
recomendo ler sobre como navegar nele. Existem alguns bons tutoriais
disponíveis online.

[root@esx1:~] vi /var/spool/cron/crontabs/root

Observação: ao usar :wq para salvar suas alterações, você provavelmente receberá
um aviso de que o arquivo é somente leitura. Você não precisa mexer nas
permissões. Basta usar :wq! e o arquivo será gravado com sucesso.  

3 of 9 04/12/2022 15:17
Agendando Tarefas no ESXi Usando Cron – vswitchzero https://vswitchzero-com.translate.goog/2021/02/17/scheduling-tasks-in-...

Eu adicionei uma única linha na parte inferior do arquivo. Aqui está o arquivo
crontab raiz atualizado:

#min hora dia mon comando dow


1 1 * * * /sbin/tmpwatch.py
1 * * * * /sbin/auto-backup.sh
0 * * * * /usr/lib/vmware/vmksummary/log-heartbeat.py
*/5 * * * * /bin/hostd-probe.sh ++group=host/vim/vmvisor/hostd-
probe/stats/sh
00 1 * * * localcli storage core device purge
*/10 * * * * /bin/crx-cli gc
*/2 * * * * esxcli system syslog mark --message="Meu cron job acabou de
rodar!"

Nota: Conforme mencionado anteriormente, se você não estiver familiarizado


com a formatação min/hora/dia/seg/dow que o cron usa, há vários bons recursos
online que podem ajudar.

Apesar de atualizar o arquivo, suas alterações não terão efeito até que o serviço
crond seja reiniciado no host. Primeiro, obtenha o crond PID (identi�cador de
processo) executando o seguinte comando:

[root@esx1:~] cat /var/run/crond.pid


2098663

Em seguida, mate o crond PID. Certi�que-se de alterar o número PID para o que
você obteve na etapa anterior.

[root@esx1:~] matar 2098663

Depois que o processo for interrompido, você pode usar o BusyBox para iniciá-lo

4 of 9 04/12/2022 15:17
Agendando Tarefas no ESXi Usando Cron – vswitchzero https://vswitchzero-com.translate.goog/2021/02/17/scheduling-tasks-in-...

novamente:

[root@esx1:~] /usr/lib/vmware/busybox/bin/busybox crond

Você saberá que foi reiniciado com sucesso se tiver um novo PID agora:

[root@esx1:~] cat /var/run/crond.pid


2103414

Depois de deixar o host ocioso por alguns minutos, você pode ver que o comando
foi executado a cada dois minutos conforme desejado:

[root@esx1:~] cat /var/log/vmkernel.log |grep -i mark:


2021-02-17T17:39:00Z esxcfg-syslog[2102126]: mark: My cron job just run!
2021-02-17T20:16:00Z esxcfg-syslog[2103370]: mark: My cron job just run!
2021-02-17T20:18:00Z esxcfg-syslog[2103382]: mark: My cron job just run!
2021-02-17T20:20:00Z esxcfg-syslog[2103396]: mark: My cron job just run!

Como você pode imaginar, as possibilidades são in�nitas aqui. Compartilharei


alguns dos scripts que usei para coletar algumas métricas de desempenho via cron
em uma postagem futura.

Exemplos de Crontab

Execute um comando a cada dois minutos:

#min hour day mon dow command


*/2 * * * * esxcli system syslog mark --message="Meu cron job acabou de

5 of 9 04/12/2022 15:17
Agendando Tarefas no ESXi Usando Cron – vswitchzero https://vswitchzero-com.translate.goog/2021/02/17/scheduling-tasks-in-...

rodar!"

Execute um comando a cada hora:

#min hour day mon dow command


* */1 * * * esxcli system syslog mark --message="Meu cron job acabou de
rodar!"

Execute um comando à meia-noite todas as noites:

#min hour day mon dow command


00 0 * * * esxcli system syslog mark --message="Meu cron job acabou de
rodar!"

Execute um comando às 15h30 toda quinta-feira:

#min hour day mon dow command


30 15 * * 5 esxcli system syslog mark --message="Meu cron job acabou de
rodar!"

Execute um comando à meia-noite e ao meio-dia todos os dias:

#min hour day mon dow command


00 0,12 * * * esxcli system syslog mark --message="Meu cron job acabou de
rodar!"

Mike / 17 de fevereiro de 2021 / ESXi , vSphere /

6 of 9 04/12/2022 15:17
Agendando Tarefas no ESXi Usando Cron – vswitchzero https://vswitchzero-com.translate.goog/2021/02/17/scheduling-tasks-in-...

6 pensamentos sobre “Agendando Tarefas no ESXi


Usando Cron”

Obrigado
6 de maio de 2021 às 3h58

Oi Mike, lembre-se de dizer que é necessário fazer uma cópia em /etc/rc.local.d


/local.sh para ativá-lo na próxima reinicialização:
/bin/echo “*/2 * * * * esxcli system syslog mark ” >> /var/spool
/cron/crontabs/root

Matt
10 de junho de 2021 às 1h16

Olá Mike,
estou con�gurando uma tarefa para executar usando o cron, no entanto, quando
meu host ESXi reinicia, o crontab é revertido para seu estado original sem meu
comando adicionado.

Tudo funciona bem até que o host seja reiniciado.

Você tem alguma sugestão sobre como isso poderia ser corrigido?

Jorge Gabra
16 de julho de 2021 às 7h44

Olá Matt,

Veri�que este https://virtuallyvtrue.com/2019/03/29/shell-script-to-

7 of 9 04/12/2022 15:17
Agendando Tarefas no ESXi Usando Cron – vswitchzero https://vswitchzero-com.translate.goog/2021/02/17/scheduling-tasks-in-...

automatically-power-on-a-speci�c-vm-which-is-powered-o�-vm/

Add commands to /etc/rc.local.d/local.sh to re-generate the cron job when ESXi


host reboots

Edit /etc/rc.local.d/local.sh using a command such as “vi /etc/rc.local.d


/local.sh“.
At the end of the �le just above ‘exit 0’, add following 3 lines. The �rst kills
crond, the second adds the new cron job to the root crontab �le, and the third
restarts crond:
/bin/kill $(cat /var/run/crond.pid)
/bin/echo ‘0 */5 * * * /vmfs/volumes/lun1/power-on.sh’ >> /var/spool
/cron/crontabs/root
crond

Save and exit the �le


Run the command “auto-backup.sh” so that the change to /etc/rc.local.d
/local.sh survives a reboot.

kmonk
January 23, 2022 at 7:00 am

Instead of killing and restarting crond it would probably be better practice to


create a �le named ‘cron.update’ inside /var/spool/cron/crontab (‘touch
/var/spool/cron/crontab/cron.update’). This will cause busybox crond to reload
the crontabs and delete cron.update afterwards. (See https://git.busybox.net
/busybox/tree/miscutils/crond.c)

Deepali Kale Joshi


March 2, 2022 at 7:51 pm

Hi George,

8 of 9 04/12/2022 15:17
Agendando Tarefas no ESXi Usando Cron – vswitchzero https://vswitchzero-com.translate.goog/2021/02/17/scheduling-tasks-in-...

I modi�ed /etc/rc.local.d/local.sh and added


/bin/kill $(cat /var/run/crond.pid)
/bin/echo ‘0 */5 * * * /vmfs/volumes/datastore1/myscript.sh’ >> /var/spool
/cron/crontabs/root
crond

It worked only once after rebooting I saw that the root crontab had the changes I
made.
After that I wrote a script to add these 3 lines to /etc/rc.local.d/local.sh as part of
my installation process.
Now I guess /etc/rc.local.d/local.sh does not run at the restart because I don’t see
the myscript.sh added to /var/spool/cron/crontabs/root. It always reverts back.

What could have gone wrong. I copied another �le /etc/rc.local.d/local.sh.mod to


/etc/rc.local.d/local.sh
Could that be a problem?

Thanks
Deepali

Tom
July 1, 2022 at 5:45 am

Possibly you have UEFI secure boot enabled? If that is the case the script will not
be executed during boot.

Blog vswitchzero / em WordPress.com.

9 of 9 04/12/2022 15:17

Você também pode gostar