Onde está o cron timer?

4

Existe alguma maneira de acessar os cron timers e obter os segundos restantes até a próxima execução de scripts no crontab ou talvez os segundos desde o último?

    
por james 27.02.2013 / 07:07

1 resposta

2

Não é fácil. o crond espera por um sinal do kernel e vai dormir. Quando recebe o sinal, ele verifica se há cronwares para executar naquele minuto, lança esses e volta a dormir.

É um design muito eficiente - o cron não usa nenhuma CPU enquanto está dormindo. Não tem consciência do tempo passando também. À medida que vai adormecendo, ele define um "tempo limite" com base em quanto tempo demora até que o próximo comando de qualquer trabalho com registro "registrado" seja executado.

No Solaris 10:

sol10-primary:/> # pflags  271  
271:    /usr/sbin/cron
        data model = _ILP32  flags = ORPHAN|MSACCT|MSFORK
 /1:    flags = ASLEEP  pollsys(0x8047c70,0x1,0x8047ce8,0x806ba00)

Ao rastrear o daemon do cron, você verá que ele vai dormir com um tempo limite, conforme abaixo:

waitid(P_ALL, 0, 0x08047CD0, WEXITED|WTRAPPED|WNOHANG) Err#10 ECHILD
time()                                          = 1361952435
pollsys(0x08047C70, 1, 0x08047CE8, 0x0806BA00) (sleeping...)
        fd=3  ev=POLLRDNORM rev=0
        timeout: 105.000000000 sec
        sigmask = 0 0 0 0

Quando você atualiza qualquer tarefa cron, o processo de suspensão também é ativado, mas atualiza sua própria configuração, após o qual ele volta a adormecer com o novo valor de tempo limite.

É possível ver o tempo limite definido. Observe que o cron chamou o syscall de tempo um pouco antes quando ele foi dormir (o que retorna os segundos desde o epoc), então se você observou isso (ou seja, rastreou o processo quando chamou o time () syscall, você será capaz de subtrair esse tempo de corrente e compare-o com o tempo limite definido na chamada do pollsys.

Então ... como eu disse, não é fácil.

    
por 27.02.2013 / 09:17

Tags