Понадобилось решить следующую задачу - надо запускать перловый скрипт раз в 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();
}
Перловый из перла и запускай лучше)
а вообще man select, man poll
А зациклить в перле код и в конце цикла спать 5 секунд ?
>А зациклить в перле код и в конце цикла спать 5 секунд
>?А я про что? :) А вообще это сложно, лучше написать свой шедулер)) А лучше операционку)
>Понадобилось решить следующую задачу - надо запускать перловый скрипт раз в 5
>секунд.
[...]
> system("/home/cgi/server.pl");
#!/bin/shwhile sleep 5
do
/home/cgi/server.pl
done
>>Понадобилось решить следующую задачу - надо запускать перловый скрипт раз в 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 запускала твою прогу, тогда точность будет намного выше и не поползет от промежуточных погрешностей. Конечно, значение инит-таймера придется время от времени сбрасывать, чтоб не переполнились переменные при рассчете, но это я оставляю на самостоятельную реализацию ;))))
>#!/bin/sh
>
>while sleep 5
>do
> /home/cgi/server.pl
>doneГыы :-)
прикольно! вот что значит не знать sh :-)
спасибо за совет.зато теперь я знаю как делать демонов :-)
>>#!/bin/sh
>>
>>while sleep 5
>>do
>> /home/cgi/server.pl
>>done
>
>Гыы :-)
>прикольно! вот что значит не знать sh :-)
>спасибо за совет.
>
>зато теперь я знаю как делать демонов :-)демоны это немножко другое
а в данном случае пример программы с засыпанием в Н секунд
Сам недавно искал.Гуру используют select/pool
:)
>Сам недавно искал.
>
>Гуру используют select/pool
>
>:)Да .. да, я знал! :-)
А вообще и crond использует select, не только гуру :-)