cron vs. sleep - qual é a melhor em termos de utilização eficiente da CPU / memória?

18

O caso:

Preciso executar alguns comandos / script em determinados intervalos de tempo e, para isso, tenho duas opções:

  1. configurar um crontrabalho
  2. implementar um loop sleepno próprio script.

Questão:

Qual é a melhor opção do ponto de vista do consumo de recursos, por quê? É crono melhor caminho? O cron usa algum tipo de gatilho ou algo que o torna eficiente em relação ao outro? Qual procedimento o cron usa para verificar e iniciar os trabalhos?

preciso
fonte

Respostas:

14

Use cron porque é uma prática melhor e mais padrão. Pelo menos se isso é algo que será executado regularmente (não apenas algo que você consertou em um minuto). croné uma maneira mais limpa e mais padrão. Também é melhor porque executa o shell desconectado de um terminal - não há problema com terminação acidental e dependências de outros processos.

Em relação aos recursos: CPU: Ambos os processos dormem - quando dormem, não desperdiçam CPU. cronacorda com mais frequência para verificar as coisas, mas faz isso de qualquer maneira (não mais para o seu processo). E isso é carga insignificante, a maioria dos daemons acorda ocasionalmente. Memória: Você provavelmente está cronexecutando, independentemente deste processo, portanto, isso não representa nenhuma sobrecarga. No entanto, o cron só iniciará o shell quando o script for chamado, enquanto o script permanecerá carregado na memória (um processo bash com ambiente - alguns kilobytes, a menos que você esteja carregando tudo nas variáveis ​​do shell).

Em suma, para recursos não importa.

orion
fonte
19

Use cron(ou anacron).

Cron é projetado para executar coisas em intervalos. Essa é a única coisa que faz, e tem havido muito trabalho colocado no cron por muitos anos para torná-lo o que é hoje.

As chances de você escrever um agendador melhor em seu script são efetivamente nulas. O uso do cron funcionará melhor, evite ter código desnecessário em seu script e mantenha seu código conciso e mais sustentável.

Não reinvente a roda se não for necessário.

bahamat
fonte
10

Já existem boas respostas crone sleepdesempenho, mas quero adicionar algum tipo de comparação de recursos.

Pro cron:

  • já em execução nos sistemas Unix / Linux
  • estável e comprovado
  • projetado para processos em segundo plano
  • é executado a partir da inicialização do sistema, e seu script, assim que instalado
  • entrada mais fácil de ciclos de longo prazo (horas, dias, semanas)
  • permite repetições complexas a longo prazo ("todo segundo domingo às 5h35")

Pro sleep:

  • mais fácil de manter em um script
  • mais fácil para processos em primeiro plano
  • permite tempos de sono mais curtos e precisos que um minuto
  • permite ciclos complexos de sono / ação ("execute esta parte, durma 10 segundos, execute a outra parte e durma duas horas")
Dubu
fonte
4

O cron usa algum tipo de gatilho ou algo que o torna eficiente em relação ao outro?

Eu dei uma olhada cat /proc/`pidof crond`/stack. Depois de imprimi-lo por algumas vezes consecutivas, vejo que crondapenas dorme em 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 O utilitário usa a mesma chamada do 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 que ambos os utilitários ( crond& sleep) devam ter baixa utilização da CPU e, se você precisar imitar, cronpode usá-lo definitivamente sleep.

Atualizar. É melhor observar cronda atividade com

strace -p `pidof crond`
Sergei Kurenkov
fonte
Resposta altamente subestimada.
Hashim
3

A principal diferença que você está procurando é que cronnão está funcionando constantemente. Como explicado em 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.

Em outras palavras, cronserá iniciado apenas uma vez por minuto e testará se deve ser executado. Sua abordagem do sono, por outro lado, exigiria que seu sleepcomando real , seu shell, seu terminal e o whileloop (ou qualquer outro) fossem executados ao mesmo tempo.

Mesmo se eles estivessem lançando o mesmo número de processos, cronseria melhor. Foi escrito precisamente para isso por pessoas que tendem a ser muito boas em seu trabalho. É obrigado a fazer um trabalho melhor do que um simples loop de shell.

terdon
fonte
5
Ambos dormem - efetivamente não há diferença. Sua concha que dorme também acorda apenas quando o sono expira. Ele não usa mais CPU que o cron. De qualquer forma, o cron acorda com mais frequência porque precisa verificar se alguma coisa mudou, enquanto o processo dorme o tempo todo. No entanto, você recebe outro processo do bash (além do cron, que é executado de qualquer maneira), portanto, ele usa um pouco mais de RAM (alguns kB).
orion
3

A diferença é que, à medida que você adiciona mais scripts que precisam dormir, você terá mais processos aguardando, em vez de um único processo (cron) que ativa e executa todos os scripts agendados que fecham até a próxima execução. O Cron permite um processo especializado para executar outros scripts dentro do prazo, além do cron permitir que você agende relativamente livremente quando algo deve ser executado, dias da semana ou mês, horários específicos ou apenas a cada 5 minutos, etc.

* Ver isso de novo me fez pensar em outra vantagem do cron. Todos os scripts executados periodicamente estão em um só lugar, e é fácil verificar a partir daí quando e com que frequência eles serão executados. Caso contrário, você deve verificar os scripts individuais.

Benjamin Scherer
fonte
1

Já existem respostas boas e mais informadas, mas eu só queria ressaltar que sleep, com , você pode congelar o processo por um período variável de tempo, digamos, em função de outras variáveis.

Se estou escrevendo um script para verificar a porcentagem de bateria restante e notify-sendse ele estiver abaixo do nível crítico predefinido, posso fazer o script sleeppelo período de tempo que é uma função do nível atual da bateria em porcentagem, em vez de verificar a bateria a cada um ou dois minutos com a ajuda do cron, mesmo quando eu sei que eram 80% na última verificação.

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
fonte
0

Usar em sleepvez de cronum único trabalho pode ser mais eficiente. Mas como você costuma cronrodar de qualquer forma, usá-lo é de graça ou quase o suficiente, pois não faz diferença. Portanto, a menos que você esteja em um cronsistema embarcado sem o uso de outros recursos, eu aceitaria cron.

MvG
fonte