cron vs. sleep - qual è il migliore in termini di utilizzo efficiente della CPU / memoria?


18

Il caso:

Ho bisogno di eseguire alcuni comandi / script a determinati intervalli di tempo e per questo ho due opzioni:

  1. impostare un cron-job
  2. implementare un ciclo con sleepnello script stesso.

Domanda:

Qual è l'opzione migliore dal punto di vista del consumo di risorse, perché? È cronil modo migliore? Cron usa una sorta di trigger o qualcosa che lo rende efficiente rispetto all'altro? Quale procedura usa cron per controllare e avviare i lavori?

Risposte:


14

Usa cron perché è una pratica migliore e più standard. Almeno se questo è qualcosa che verrà eseguito regolarmente (non solo qualcosa che hai riparato insieme in un minuto). cronè un modo più pulito e più standard. È anche meglio perché esegue la shell staccata da un terminale - nessun problema con la chiusura accidentale e dipendenze da altri processi.

Per quanto riguarda le risorse: CPU: entrambi i processi dormono: quando dormono, non sprecano CPU. cronsi sveglia più frequentemente per controllare le cose, ma lo fa comunque (non più per il processo). E questo è un carico trascurabile, la maggior parte dei demoni si sveglia di tanto in tanto. Memoria: probabilmente è in cronesecuzione indipendentemente da questo processo, quindi questo non è affatto sovraccarico. Tuttavia, cron avvia la shell solo quando viene chiamato lo script, mentre lo script rimane caricato in memoria (un processo bash con ambiente - alcuni kilobyte, a meno che non si carichi tutto nelle variabili shell).

Tutto sommato, per le risorse non importa.


19

Usa cron(o anacron).

Cron è progettato per eseguire le cose a intervalli. Questa è l'unica cosa che fa, e c'è stato un sacco di lavoro messo in cron per molti anni per renderlo quello che è oggi.

Le probabilità che tu abbia intenzione di scrivere un programmatore migliore nella tua sceneggiatura sono effettivamente nulle. L'uso di cron funzionerà meglio, evita di avere codice non necessario nello script e mantieni il codice conciso e più gestibile.

Non reinventare la ruota se non è necessario.


10

Ci sono già alcune buone risposte crone sleepprestazioni, ma voglio aggiungere una sorta di confronto delle funzionalità.

Pro cron:

  • già in esecuzione su sistemi Unix / Linux
  • stabile e comprovato
  • progettato per processi in background
  • viene eseguito dall'avvio del sistema in poi, così come lo script, una volta installato
  • inserimento più semplice di cicli a lungo termine (ore, giorni, settimane)
  • consente ripetizioni a lungo termine complesse ("ogni seconda domenica alle 5:35")

Pro sleep:

  • più facile da mantenere in uno script
  • più facile per i processi in primo piano
  • consente tempi di sonno più brevi e più precisi di un minuto
  • consente cicli di sonno / azione complessi ("esegui questa parte, quindi dormi 10 secondi, quindi esegui l'altra parte e dormi due ore")

4

Cron usa una sorta di trigger o qualcosa che lo rende efficiente rispetto all'altro?

Ho dato un'occhiata cat /proc/`pidof crond`/stack . Avendolo stampato per alcune volte consecutive, vedo che cronddorme solo in 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 l'utilità utilizza la stessa chiamata di 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

Presumo che entrambe le utilità (crond & sleep) debbano avere un basso utilizzo della CPU e se è necessario imitarle, cronè possibile utilizzarle sicuramente sleep.

Aggiornare. È meglio osservare crondl'attività con

strace -p `pidof crond`

Risposta altamente sottovalutata.
Hashim,

3

La differenza principale che stai cercando è che cronnon funziona costantemente. Come spiegato in 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.

In altre parole, cronverrà avviato solo una volta al minuto e verificherà se deve essere eseguito. Il tuo approccio al sonno, d'altra parte, richiederebbe che il tuo sleepcomando effettivo , la tua shell, il tuo terminale e il whileciclo (o qualunque cosa) siano in esecuzione contemporaneamente.

Anche se avessero avviato lo stesso numero di processi, cronsarebbe meglio. È scritto proprio per questo da persone che tendono ad essere molto brave nel loro lavoro. È tenuto a fare un lavoro migliore rispetto a un semplice loop di shell.


5
Entrambi dormono: in realtà non c'è differenza. Anche la shell che dorme si sveglia solo quando il sonno scade. Non utilizza più CPU di cron. Semmai, cron si sveglia più frequentemente perché deve controllare se qualcosa è cambiato, mentre il tuo processo resta sempre inattivo. Tuttavia, viene caricato un altro processo bash (oltre a cron, che viene eseguito comunque), quindi utilizza un po 'più di RAM (qualche KB).
orion,

3

La differenza sta nel fatto che quando aggiungi più script che hanno bisogno di dormire, finirai con più processi che dormono in attesa, invece di un singolo processo (cron) che si riattiva ed esegue tutti gli script programmati che poi si chiudono alla prossima esecuzione. Cron consente un processo specializzato per l'esecuzione puntuale di altri script, oltre a cron consente di pianificare relativamente liberamente quando eseguire qualcosa, giorni della settimana o del mese, orari specifici o solo ogni 5 minuti ecc.

* Solo vederlo di nuovo mi ha fatto pensare ad un altro vantaggio di cron. Tutti gli script che vengono eseguiti periodicamente sono quindi in un unico posto ed è facile controllare da lì quando e con quale frequenza verranno eseguiti. Altrimenti devi controllare i singoli script.


1

Ci sono già risposte valide e più informate, ma volevo solo sottolineare che con sleep, hai la possibilità di congelare il processo per un periodo di tempo variabile, ad esempio in funzione di alcune altre variabili.

Se sto scrivendo uno script per controllare la percentuale di batteria rimasta e notify-sendse è al di sotto del livello critico predefinito, posso creare lo script sleepper la quantità di tempo che è una funzione del livello attuale della batteria in percentuale invece di controllare la batteria ogni uno o due minuti con l'aiuto di cron anche quando so che era l'ultimo all'80%.

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

0

L'utilizzo sleepanziché cronper un singolo lavoro potrebbe essere più efficiente. Ma dal momento che di solito in cronesecuzione in ogni caso, il suo utilizzo è gratuito o abbastanza vicino in quanto non fa alcuna differenza. Quindi, a meno che non ci si trovi su un cronsistema incorporato altrimenti libero , sceglierei cron.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.