it-swarm-pt.tech

Como executar scripts a cada 5 segundos?

Eu tenho um script que precisa ser executado a cada cinco segundos. Eu sei que cron pode fazer tarefas por minuto, mas existe uma maneira de executar algo a cada segundo?

61
myusuf3

Cron permite apenas um mínimo de um minuto. O que você poderia fazer é escrever um script Shell com um loop infinito que executa sua tarefa e, em seguida, dorme por 5 segundos. Dessa forma, sua tarefa seria executada mais ou menos a cada 5 segundos, dependendo de quanto tempo a tarefa leva.

#!/bin/bash

while true; do
  # Do something
  sleep 5;
done

Você pode criar um arquivo my-task.sh com o conteúdo acima e executá-lo com sh my-task.sh. Opcionalmente, você pode configurá-lo com supervisor como um serviço para que ele seja iniciado quando o sistema for inicializado, etc.

Realmente parece que você está fazendo algo que você provavelmente não deveria estar fazendo. Isso parece errado .

61
Tommy Brunn

Você pode ter um trabalho cron dando início a um script a cada minuto que inicia 12 processos em segundo plano, assim:

* * * * * ~/dostuff.sh

dostuff.sh:

(sleep 5 && /path/to/task) &
(sleep 10 && /path/to/task) &
(sleep 15 && /path/to/task) &
(sleep 20 && /path/to/task) &
(sleep 25 && /path/to/task) &
(sleep 30 && /path/to/task) &
(sleep 35 && /path/to/task) &
(sleep 40 && /path/to/task) &
(sleep 45 && /path/to/task) &
(sleep 50 && /path/to/task) &
(sleep 55 && /path/to/task) &
(sleep 60 && /path/to/task) &

Minha pergunta, no entanto, é O que na EARTH você poderia estar fazendo que precisa ser executado a cada 5 segundos?

32
warren

Apenas use um loop:

while true ; do ./your-script & sleep 5; done

Isto irá iniciar o seu script como um trabalho em segundo plano, dormir por 5 segundos e, em seguida, repetir o loop novamente. Você pode usar Ctrl-C para abortar ou usar qualquer outra condição em vez de true, por exemplo ! test -f /tmp/stop-my-script para apenas fazer loop enquanto o arquivo /tmp/stop-my-script não existe.

27
blueyed

Você poderia usar o pacote GNU mcron , uma alternativa "Vixie cron".

http://www.gnu.org/software/mcron/manual/mcron.html#Top

"Pode facilmente permitir que pontos de tempo mais finos sejam especificados, ou seja, segundos. Em princípio, isso pode ser estendido para microssegundos, mas isso não é implementado."

10
David

Use cactos para monitorar o roteador e o switch, mas o Cron só permite um mínimo de um minuto, portanto, se uma porta/dispositivo estiver inativa, não haverá aviso até dois minutos depois.

2
qttty

Configuração mínima no cron é de minutos, você não pode configurá-lo por 5 segundos. Você poderia usar o Quartz, que permite segundos. http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html

2
Cody Harlow

Você pode usar uma unidade temporizadora SystemD, que acionará um serviço - que você configuraria para fazer o que quiser - a cada 5 segundos.

Suponha que sua unidade de serviço seja chamada mystuff.service e esteja instalada em /etc/systemd/system (check out serviços de usuário do SystemD se você quiser substituir o crontab de um usuário), então você pode escrever uma unidade temporizada para executar o serviço no momento da inicialização e então a cada 5 segundos, assim:

/etc/systemd/system/mystuff.timer

[Unit]
Description=my stuff's schedule
[Timer]
OnBootSec=5
OnUnitActiveSec=5
[Install]
WantedBy=timers.target

Em seguida, recarregue a configuração do systemd, ative a unidade do temporizador e inicie-a.

2
Guss

Eu fiz esse tipo de coisa com muito sucesso (e o resultado final perde semanas de cada vez, até que a máquina seja reinicializada). Quanto ao que eu estava fazendo agora, atualizando informações e colocando-as em cache - atualizando a cada 10 segundos.

#!/bin/sh

SLEEP=5

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# echo and restart...
exec $0

O 'exec $ 0' reinicia o script, mas substitui o script em execução. Pode ser iniciado inicialmente com uma linha crontab '@reboot'.

1
Alister Bulman