Cron executando o trabalho a cada 15 segundos

15

Você poderia me informar o que escrever em crontab para que execute algum trabalho (para testes eu usarei /usr/bin/chromium-browser ) a cada 15 segundos?

    
por xralf 11.04.2011 / 20:52

4 respostas

24

Você não pode ficar abaixo da granularidade de um minuto com o cron. O que você pode fazer é, a cada minuto, executar um script que executa seu trabalho, aguarda 15 segundos e repete. A seguinte linha crontab iniciará some_job a cada 15 segundos.

* * * * * for i in 0 1 2; do some_job & sleep 15; done; some_job

Esse script pressupõe que o trabalho nunca levará mais de 15 segundos. O script a seguir, um pouco mais complexo, cuida de não executar a próxima instância se demorar muito para ser executado. Ele depende de date suportando o formato %s (por exemplo, GNU ou Busybox, então você ficará bem no Linux). Se você colocá-lo diretamente em um crontab, observe que % caracteres devem ser escritos como \% em uma linha crontab.

end=$(($(date +%s) + 45))
while true; do
  some_job &
  [ $(date +%s) -ge $end ] && break
  sleep 15
  wait
done
[ $(date +%s) -ge $(($end + 15)) ] || some_job

Entretanto, observarei que, se você precisar executar um trabalho com a mesma frequência que a cada 15 segundos, o cron provavelmente será a abordagem errada. Embora os unices sejam bons com processos de curta duração, a sobrecarga de lançar um programa a cada 15 segundos pode ser não negligenciável (dependendo de quão exigente é o programa). Você não pode executar seu aplicativo o tempo todo e executá-lo a cada 15 segundos?

    
por 11.04.2011 / 21:31
11

Diferente do que os outros: Execute 4 cronjobs, cada um escalonado por 15 segundos:

* * * * * sleep 00; timeout 15s some_job
* * * * * sleep 15; timeout 15s some_job
* * * * * sleep 30; timeout 15s some_job
* * * * * sleep 45; timeout 15s some_job

Para evitar que o trabalho interfira em si próprio, limitamos seu tempo de execução a 15 segundos via GNU coreutils ' timeout para cada trabalho. Observe, no entanto, que se o trabalho não sair corretamente no final dos 15s, você ainda poderá ter problemas. Consulte o manual do comando para obter detalhes sobre como resolver isso se se tornar um problema. Observe também que, se o comando demorar mais de 15 segundos, e o tempo limite o eliminar, você receberá um status de saída diferente de zero, o que acionará um email do cronjob.

    
por 26.05.2015 / 18:21
2

Em suma, o cron não é tão granular com o tempo. O período mais curto que você receberá é de 1 min.

#       .---------------- minute (0 - 59)
#       |       .------------- hour (0 - 23)
#       |       |       .---------- day of month (1 - 31)
#       |       |       |       .------- month (1 - 12) OR jan,feb,mar,apr ...
#       |       |       |       |       .----- day of week (0 - 6) (Sunday=0 or 7)  OR sun,mon,tue,wed,thu,fri,sat
#       |       |       |       |       |
#       *       *       *       *       *       command to be executed
        *       *       *       *       /usr/bin/chromium-browser

No entanto, você poderia escrever um script que seria executado a cada 15 segundos ...

    
por 11.04.2011 / 21:06
1

No seu crontab:

* * * *  /usr/bin/chromium-browser_starter

Em seguida, em /usr/bin/chromium-browser_starter :

#!/bin/sh

# chromium-browser_starter
#
# Schedules /usr/bin/chromium-browser to run every 15 seconds for a minute.
# Intended to be called every minute through crond(8).

for ((secs=0; secs<46; secs+=15)); do
    (sleep $secs; /usr/bin/chromium-browser "$@") &
done

wait
    
por 11.04.2011 / 21:32

Tags