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:
configurar un crontrabajo
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?
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).
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.
¿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.
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.
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.
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=15while 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 inif["$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
fielse# 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 100fifidone
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.
La principal diferencia que está buscando es que
cron
no se ejecuta constantemente. Como se explica enman cron
:En otras palabras,
cron
solo se iniciará una vez por minuto y comprobará si debe ejecutarse. Su enfoque de sueño, por otro lado, requeriría que susleep
comando real , su shell, su terminal y elwhile
bucle (o lo que sea) se ejecuten al mismo tiempo.Incluso si estuvieran lanzando el mismo número de procesos,
cron
serí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.fuente
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.
fuente
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-send
si está por debajo del nivel crítico predefinido, puedo hacer la secuenciasleep
de 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
fuente
Usar en
sleep
lugar decron
para un solo trabajo podría ser más eficiente. Pero dado que normalmente tienescron
correr en cualquier caso, usarlo es gratis, o lo suficientemente cerca, ya que no hay diferencia. Entonces, a menos que esté en uncron
sistema embebido que de otro modo estaría libre, iría porcron
.fuente