URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3771
[ Назад ]

Исходное сообщение
"Пишу свой шедулер"

Отправлено se7en.ru , 27-Дек-04 16:21 
Понадобилось решить следующую задачу - надо запускать перловый скрипт раз в 5 секунд.
Т.к. cron интервалы меньше 1 минуты не понимает написал свою програмку.
В принципе всё работает, но мне кажется что дурью маюсь и ответ лежит на поверхности. Как из подобных ситуаций выходят гуру?

Кому интересно програмка:
#include <unistd.h>
#include <stdio.h>
#include <syslog.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>
#include <sys/cdefs.h>
#include <sys/_null.h>
#include <sys/_types.h>

void fsignal(int sig) {
  switch(sig) {
    case SIGALRM:
      system("/home/cgi/server.pl");
      break;
    case SIGTERM:
    case SIGINT:
    case SIGQUIT:
      syslog(LOG_NOTICE,"DAEMON_TST daemon stopped on signal %d",sig);
      closelog();
      exit(0);
      break;
    default:
      break;
  }
}

int main(int argc,char** argv) {
  struct itimerval val;
//  setgid(65534);
//  setuid(65534);
//  chdir("/");
  fclose(stdin);
  fclose(stdout);
  fclose(stderr);
  if(fork())
    exit(0);
  setsid();
  int j;
  for(j=1; j<32; j++) {
    signal(j,fsignal);
  }
  syslog(LOG_NOTICE,"DAEMON_TST daemon started");
  val.it_interval.tv_sec = 5;
  val.it_interval.tv_usec = 0;
  val.it_value.tv_sec = 5;
  val.it_value.tv_usec = 0;
  setitimer(ITIMER_REAL, &val, 0);
  while(1) pause();
}


Содержание

Сообщения в этом обсуждении
"Пишу свой шедулер"
Отправлено Vladislav Lazarenko , 28-Дек-04 22:27 
Перловый из перла и запускай лучше)
а вообще man select, man poll

"Пишу свой шедулер"
Отправлено XMan , 29-Дек-04 00:26 
А зациклить в перле код и в конце цикла спать 5 секунд ?

"Пишу свой шедулер"
Отправлено Vladislav Lazarenko , 29-Дек-04 12:01 
>А зациклить в перле код и в конце цикла спать 5 секунд
>?

А я про что? :) А вообще это сложно, лучше написать свой шедулер)) А лучше операционку)


"Пишу свой шедулер"
Отправлено ACCA , 29-Дек-04 02:06 
>Понадобилось решить следующую задачу - надо запускать перловый скрипт раз в 5
>секунд.
[...]
>      system("/home/cgi/server.pl");


#!/bin/sh

while sleep 5
do
   /home/cgi/server.pl
done


"Пишу свой шедулер"
Отправлено Alexander S. Salieff , 29-Дек-04 18:22 
>>Понадобилось решить следующую задачу - надо запускать перловый скрипт раз в 5
>>секунд.
>[...]
>>      system("/home/cgi/server.pl");
>
>
>#!/bin/sh
>
>while sleep 5
>do
>   /home/cgi/server.pl
>done


Ну конечно, не слушай их ;) Они тебе весь полет фантазии задушат ;) На начальном этапе обязательно нужно писать на C аналоги write, netcat, tcpserver, shell-scripts и т.д. Очень развивает мышление и заставляет разбираться в ранее неизведанных ситуациях. Я бы посоветовал сделать основную ветку проги зацикленную, но чтобы она не спала все 5 секунд, а щелкала по 1000 раз в секунду, постоянно сверяясь с системным таймером, сохраняя временное первого запуска, а когда текущее время будет прошлый раз + N*5 сек, форкалась и через exec запускала твою прогу, тогда точность будет намного выше и не поползет от промежуточных погрешностей. Конечно, значение инит-таймера придется время от времени сбрасывать, чтоб не переполнились переменные при рассчете, но это я оставляю на самостоятельную реализацию ;))))


"Пишу свой шедулер"
Отправлено se7en.ru , 30-Дек-04 12:50 
>#!/bin/sh
>
>while sleep 5
>do
>   /home/cgi/server.pl
>done

Гыы :-)
прикольно! вот что значит не знать sh :-)
спасибо за совет.

зато теперь я знаю как делать демонов :-)


"Пишу свой шедулер"
Отправлено kir , 05-Янв-05 19:44 
>>#!/bin/sh
>>
>>while sleep 5
>>do
>>   /home/cgi/server.pl
>>done
>
>Гыы :-)
>прикольно! вот что значит не знать sh :-)
>спасибо за совет.
>
>зато теперь я знаю как делать демонов :-)

демоны это немножко другое
а в данном случае пример программы с засыпанием в Н секунд


"Пишу свой шедулер"
Отправлено HEaLIX , 14-Янв-05 00:06 
Сам недавно искал.

Гуру используют select/pool

:)


"Пишу свой шедулер"
Отправлено Vladislav Lazarenko , 14-Янв-05 13:03 
>Сам недавно искал.
>
>Гуру используют select/pool
>
>:)

Да .. да, я знал! :-)

А вообще и crond использует select, не только гуру :-)