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:
configurar um crontrabalho
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?
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).
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.
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.
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.
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=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 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.
A principal diferença que você está procurando é que
cron
não está funcionando constantemente. Como explicado emman cron
:Em outras palavras,
cron
será iniciado apenas uma vez por minuto e testará se deve ser executado. Sua abordagem do sono, por outro lado, exigiria que seusleep
comando real , seu shell, seu terminal e owhile
loop (ou qualquer outro) fossem executados ao mesmo tempo.Mesmo se eles estivessem lançando o mesmo número de processos,
cron
seria 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.fonte
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.
fonte
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-send
se ele estiver abaixo do nível crítico predefinido, posso fazer o scriptsleep
pelo 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
fonte
Usar em
sleep
vez decron
um único trabalho pode ser mais eficiente. Mas como você costumacron
rodar 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 umcron
sistema embarcado sem o uso de outros recursos, eu aceitariacron
.fonte