Como posso usar o cron para agendar um script que implemente o horário de verão em um aplicativo não compatível com DST quando meu servidor usa automaticamente o DST?

5

Meu servidor (executando o servidor Ubuntu 8.04LTS) reporta a hora como 9:38 PM BST agora. BST (horário de verão britânico) é de 1 hora à frente do UTC (ou Greenwich Mean Time, se você realmente quer confundir as coisas)

O ato do parlamento define que nós, no Reino Unido, usamos o BST para

  

o período que começa à uma hora,   Horário de Greenwich, na manhã de   no último domingo de março e terminando em   uma hora, horário de Greenwich, em   na manhã do último domingo em   Outubro.

Não há problemas para agendar isso no cron, mas não sei o formato de data / fuso horário que eu deveria estar usando. Eu configuro para avançar às 1 da manhã, mas às 2 da manhã, quando termina? Isso faz sentido se a máquina usa BST, mas eu me preocupo que o cron não acione às 2 da manhã porque o relógio do sistema pode ser redefinido de volta para 01:00 antes de ter a chance de acionar - fazendo com que meu script seja atrasado 1 hora. >

Ou apenas usa o UTC?

    
por Neil Trodden 04.09.2010 / 22:44

2 respostas

3

A resposta está nas fontes do cron (que você pode obter por apt-get source cron ), particularmente no loop principal nas linhas 159--272 do arquivo cron.c .

crond dorme por um minuto, depois acorda e consulta o tempo do sistema, comparando-o com a sua própria ideia de tempo (ou seja, a que horas seria se nada alterasse o relógio). Baseado na diferença entre o tempo real e o esperado, crond tem diferentes ações; dois deles são relevantes no seu caso:

  1. O tempo avançou mais de 5 minutos, mas menos de 3 horas (DST é iniciado): o cron executa tarefas curinga programadas no tempo real, e qualquer trabalho agendado em um horário fixo entre o tempo computado e o tempo real. Fonte relevante está nas linhas 221--247:

      /*
       * case 2: timeDiff is a medium-sized positive number,
       * for example because we went to DST run wildcard
       * jobs once, then run any fixed-time jobs that would
       * otherwise be skipped if we use up our minute
       * (possible, if there are a lot of jobs to run) go
       * around the loop again so that wildcard jobs have
       * a chance to run, and we do our housekeeping
       */
      Debug(DSCH, ("[%d], DST begins %d minutes to go\n",
          getpid(), timeRunning - virtualTime))
      /* run wildcard jobs for current minute */
      find_jobs(timeRunning, &database, TRUE, FALSE);
    
    
      /* run fixed-time jobs for each minute missed */ 
      do {
         if (job_runqueue())
                 sleep(10);
         virtualTime++;
         find_jobs(virtualTime, &database, FALSE, TRUE);
         set_time();
      } while (virtualTime< timeRunning &&
          clockTime == timeRunning);
      break;
    
  2. O tempo passou de menos de 3 horas (o horário de verão termina): basta executar trabalhos com curinga, pule os trabalhos de cronograma fixo, pois eles já corre. Fonte relevante está nas linhas 247--258:

    /*
     * case 3: timeDiff is a small or medium-sized
     * negative num, eg. because of DST ending just run
     * the wildcard jobs. The fixed-time jobs probably
     * have already run, and should not be repeated
     * virtual time does not change until we are caught up
     */
    Debug(DSCH, ("[%d], DST ends %d minutes to go\n",
        getpid(), virtualTime - timeRunning))
    find_jobs(timeRunning, &database, TRUE, FALSE);
    break;
    

Então, ao digitar DST, você não deve ter nenhum problema: seu script será executar (ou antes ou imediatamente após o salto de tempo).

Ao sair do horário de verão, há um risco de que seu trabalho (de tempo fixo) seja ignorado, se você agendar exatamente às 01:00. Minha sugestão seria para agendar a corrida ou 1 minuto antes da 1 hora, ou às 2 horas (ou depois).

    
por Riccardo Murri 07.09.2010 / 19:06
0

Você pode tentar alternar o UTC=no se for yes ou vice-versa em /etc/default/rcS . Para fazer isso, execute:

gksu gedit /etc/default/rcS
  • Alterar UTC=no para UTC=yes , ou
  • Alterar UTC=yes para UTC=no .

Salve o arquivo, saia do editor de texto e reinicie o computador.

    
por aatdark 04.09.2010 / 23:54