cron vs. sleep: ¿cuál es el mejor en términos de uso eficiente de la CPU / memoria?

18

El caso:

Necesito ejecutar algunos comandos / script en ciertos intervalos de tiempo y para esto tengo dos opciones:

  1. configurar un crontrabajo
  2. implementar un bucle con sleepen el script mismo.

Pregunta:

¿Cuál es la mejor opción desde el punto de vista del consumo de recursos, por qué? Es cronla mejor manera? ¿Cron utiliza algún tipo de disparador o algo que lo hace eficiente sobre el otro? ¿Qué procedimiento usa cron para verificar e iniciar los trabajos?

preciso
fuente

Respuestas:

14

Use cron porque es una práctica mejor y más estándar. Al menos si esto es algo que se ejecutará regularmente (no solo algo que parches juntos en un minuto). cronEs una forma más limpia y estándar. También es mejor porque ejecuta el shell separado de un terminal, no hay problema con la terminación accidental y las dependencias de otros procesos.

En cuanto a los recursos: CPU: Ambos procesos duermen; cuando duermen, no desperdician CPU. cronse despierta con más frecuencia para verificar las cosas, pero lo hace de todos modos (no más para su proceso). Y esta es una carga insignificante, la mayoría de los demonios se despiertan ocasionalmente. Memoria: Probablemente se cronesté ejecutando independientemente de este proceso, por lo que no se trata de una sobrecarga. Sin embargo, cron solo iniciará el shell cuando se invoque el script, mientras que el script permanece cargado en la memoria (un proceso bash con entorno, unos pocos kilobytes, a menos que esté cargando todo en variables de shell).

En general, para los recursos no importa.

Orión
fuente
19

Uso cron(o anacron).

Cron está diseñado para ejecutar cosas a intervalos. Eso es lo único que hace, y se ha trabajado mucho en cron durante muchos años para que sea lo que es hoy.

Las posibilidades de que va a escribir un mejor programador en su script son efectivamente nulas. Usar cron funcionará mejor, evite tener código innecesario en su script y mantenga su código conciso y más fácil de mantener.

No reinvente la rueda si no es necesario.

bahamat
fuente
10

Ya hay algunas buenas respuestas crony sleeprendimiento, pero quiero agregar algún tipo de comparación de características.

Pro cron:

  • ya se ejecuta en sistemas Unix / Linux
  • estable y probado
  • diseñado para procesos en segundo plano
  • se ejecuta desde el inicio del sistema en adelante, y también lo hará su script, una vez instalado
  • entrada más fácil de ciclos a largo plazo (horas, días, semanas)
  • permite repeticiones complejas a largo plazo ("cada segundo domingo a las 5:35 am")

Pro sleep:

  • más fácil de mantener en un script
  • más fácil para procesos en primer plano
  • permite tiempos de sueño más cortos y precisos que un minuto
  • permite ciclos complejos de sueño / acción ("ejecuta esta parte, luego duerme 10 segundos, luego ejecuta la otra parte y duerme dos horas")
Dubu
fuente
4

¿Cron utiliza algún tipo de disparador o algo que lo hace eficiente sobre el otro?

He echado un vistazo a cat /proc/`pidof crond`/stack. Después de haberlo impreso varias veces consecutivas, veo que crondsolo duerme en hrtimer_nanosleep.

>cat /proc/`pidof crond`/stack
[<ffffffff810a0614>] hrtimer_nanosleep+0xc4/0x180
[<ffffffff810a073e>] sys_nanosleep+0x6e/0x80
[<ffffffff8100b072>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff

sleep La utilidad utiliza la misma llamada al sistema.

>sleep 100 &
[1] 12761
>cat /proc/12761/stack
[<ffffffff810a0614>] hrtimer_nanosleep+0xc4/0x180
[<ffffffff810a073e>] sys_nanosleep+0x6e/0x80
[<ffffffff8100b072>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff

Supongo que ambas utilidades ( crond& sleep) deben tener una baja utilización de la CPU y, si necesita imitar cron, definitivamente puede usar sleep.

Actualizar. Es mejor observar crondla actividad con

strace -p `pidof crond`
Sergei Kurenkov
fuente
Respuesta altamente subestimada.
Hashim
3

La principal diferencia que está buscando es que cronno se ejecuta constantemente. Como se explica en man cron:

   cron then wakes up every minute, examining all stored crontabs,  check
   ing  each  command  to  see  if it should be run in the current minute.
   When executing commands, any output is  mailed  to  the  owner  of  the
   crontab (or to the user named in the MAILTO environment variable in the
   crontab, if such exists).  The children copies of  cron  running  these
   processes  have their name coerced to uppercase, as will be seen in the
   syslog and ps output.

En otras palabras, cronsolo se iniciará una vez por minuto y comprobará si debe ejecutarse. Su enfoque de sueño, por otro lado, requeriría que su sleepcomando real , su shell, su terminal y el whilebucle (o lo que sea) se ejecuten al mismo tiempo.

Incluso si estuvieran lanzando el mismo número de procesos, cronsería mejor. Está escrito precisamente para esto por personas que tienden a ser muy buenas en su trabajo. Está obligado a hacer un mejor trabajo que un simple ciclo de shell.

terdon
fuente
55
Ambos duermen, efectivamente no hay diferencia. Su caparazón que duerme también se despierta solo cuando expira el sueño. No usa más CPU que cron. En todo caso, cron se despierta con más frecuencia porque tiene que verificar si algo cambió, mientras que su proceso solo duerme todo el tiempo. Sin embargo, se carga otro proceso bash (además de cron, que se ejecuta de todos modos), por lo que utiliza un poco más de RAM (unos pocos KB).
orion
3

La diferencia es que a medida que agrega más scripts que necesitan dormir, terminará con más procesos en espera, en lugar de un solo proceso (cron) que se activa y ejecuta los scripts programados que luego se cierran hasta la próxima ejecución. Cron permite un proceso especializado para ejecutar otros scripts a tiempo, además de cron le permite programar con relativa libertad cuándo debe ejecutarse algo, días de la semana o mes, horas específicas o solo cada 5 minutos, etc.

* Solo ver esto nuevamente me hizo pensar en otra ventaja de cron. Todos los scripts que se ejecutan periódicamente se encuentran en un solo lugar, y desde allí es fácil verificar cuándo y con qué frecuencia se ejecutarán. De lo contrario, debe verificar los guiones individuales.

Benjamin Scherer
fuente
1

Ya hay respuestas buenas y más informadas, pero solo quería señalar que sleep, con la capacidad de congelar el proceso por una cantidad de tiempo variable, por ejemplo, en función de algunas otras variables.

Si estoy escribiendo una secuencia de comandos para verificar el porcentaje de batería restante y notify-sendsi está por debajo del nivel crítico predefinido, puedo hacer la secuencia sleepde comandos por la cantidad de tiempo que es una función del nivel actual de la batería en porcentaje en lugar de verificar la batería cada uno o dos minutos con la ayuda de cron, incluso cuando sé que fue el 80% la última vez que se verificó.

Battery_notify.sh

#!/bin/bash
CRIT=15
while true; do
    # current battery level
    BAT_LEVEL=`acpi -b |grep -Eo "[0-9]+%"|grep -Eo "[0-9]+"`
    interval=$((($BAT_LEVEL -$CRIT) * 120)) # loose estimate of backup time for each percentage of battery charge.
    # Is AC plugged in?
    state=`acpi -b |grep -Eo "[A-Za-z]+harging"` 
    #only notify if not Plugged in
    if [ "$state" = "Discharging" ] ; then
        # is battery below CRIT level?
        if [ $BAT_LEVEL -le $CRIT ]; then
        aplay ~/apert.wav &
        notify-send "Battery-Low!!!" -i /home/bibek/batt.png -t 900
        sleep 100  # nag me each 100 secs untill I plug the thing 
        else
            sleep $interval
        fi
    else
        # if plugged in sleep 
        if [ $BAT_LEVEL -le $CRIT ]; then
            sleep $interval
        else
            # to check if the AC is unplugged before battery gains charge above CRIT.
            sleep 100 
        fi
    fi
    done
Bibek_G
fuente
0

Usar en sleeplugar de cronpara un solo trabajo podría ser más eficiente. Pero dado que normalmente tienes croncorrer en cualquier caso, usarlo es gratis, o lo suficientemente cerca, ya que no hay diferencia. Entonces, a menos que esté en un cronsistema embebido que de otro modo estaría libre, iría por cron.

MvG
fuente