Como executar scripts a cada 5 segundos?

55

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

    
por myusuf3 04.08.2010 / 21:03

7 respostas

60

O Cron permite apenas um mínimo de um minuto. O que você poderia fazer é escrever um script de 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 da duração da tarefa.

#!/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 inicie quando o sistema for inicializado, etc.

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

    
por Tommy Brunn 04.08.2010 / 21:07
28

Você pode ter um trabalho cron iniciando um script a cada minuto, iniciando assim 12 processos em segundo plano:

* * * * * ~/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?

    
por warren 04.08.2010 / 21:24
27

Use apenas um loop:

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

Isso iniciará seu script como um trabalho em segundo plano, suspenderá por 5 segundos e, em seguida, executará 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 loop enquanto o arquivo /tmp/stop-my-script não existe.

    
por blueyed 04.08.2010 / 22:51
8

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

link

"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."

    
por David 13.05.2014 / 17:24
2

A 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. link

    
por Cody Harlow 04.08.2010 / 21:07
2

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

    
por qttty 26.11.2012 / 03:25
1

Eu fiz esse tipo de coisa com muito sucesso (e o resultado final passa semanas a 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'.

    
por Alister Bulman 04.08.2010 / 21:28