FreeBSDで遊ぶ
(ハードとソフトのページ)

powered
HOME
Ethnaのインストール
Pearのインストール
PHP-4.3.10+GD
  インストール

FreeBSD-5.3 SMP
  (Dual-CPU)化
FreeBSD-4.0 SMP
  (Dual-CPU)化
Timerプログラミング
危険なうさぎと遊ぶ
タイムサーバで遊ぶ
Vine2.6 Linux
リンク集

FreeBSD-4.0 Timerプログラミング

1)K&R-Cでプログラミング
 あるHP Internet-Webサーバ・メンテナンスで更新のために夜中に転送していて、 何でこんなことをしているんだろうか? やっぱこれこそCPUにやってもらわないとね! Stimerを作っちゃいました。単なるTimerプログラムです。

定期日付時間指定でプログラム&スクリプトをForkするプログラム(テキストファイル)
おまけサンプルbashスクリプト(FTPファイル転送)(テキストファイル)

/********************************************************************************/
/*                                                                              */
/*    著作権は放棄しません、自由に使用・改造・再配布可能です。                  */
/*    改造版を再配布する際は、必ずファイル名を変更して、オリジナルを添付して    */
/*    配布してください。                                                        */
/*                                                                              */
/*          プログラム名 : 定期日付時間指定でプログラムをForkする               */
/*                         別のshスクリプトファイルでFTPファイル転送            */
/*          ファイル名   : stimer.c                                             */
/*          概要         : 自動で年月日時間  毎日/毎週 時間指定で               */
/*                         パラメータ指定したプログラムを実行する。             */
/*                                                                              */
/*          作成者       : S.Hata                                               */
/*                                                                              */
/*          適応装置     : FreeBSD & Linuxサーバ                                */
/*                                                                              */
/*          変更履歴     : Make  2000/12/10                                     */
/*          Ver  Date                履歴(History)                氏名(Name)    */
/*         ---- --------   --------------------------------   ----------------- */
/*          0.1 00/12/12    新規作成                               S.Hata       */
/*          0.2 00/12/14    機能追加  毎時/毎週                    S.Hata       */
/*                                                                              */
/********************************************************************************/
  
#include	<stdio.h>
#include	<time.h>
 
main(int argc, char *argv[])
 
{
 
  int weeki;
  int yeari,moni,mdayi;
  int houi,mini,seci;
 
/********************************************************************************/
/*                                                                              */
/*   処理 :パラメータのチェックと各種表示と説明                                        */
/*       -o は年月日時分秒指定で1回のみ実効される                              */
/*       -d は時分秒指定で毎日 指定時間に1回のみ実効される                     */
/*       -w は時分秒指定で毎週 指定時間に1回のみ実効される                     */
/*                                                                              */
/********************************************************************************/
               
   if (( argc == 1 ) || ( argc < 6)) {
       usage();
    }
 
   if (( argc == 2 ) && ( argv[1][0] == '-' ) && ( argv[1][1] == '?' )){
       usage();
    }
 
 
/********************************************************************************/
/*                                                                              */
/*   処理 :パラメータはオプション -o のチェックと月日時分秒の範囲チェック                      */
/*       -o は年月日時分秒指定で1回のみ実効される                              */
/*                                                                              */
/********************************************************************************/
               
if (( argc == 9 ) && ( argv[1][0] =='-' ) &&
 ( argv[1][1] == 'o' || argv[1][1] =='O')){
 
/*  fprintf( stdout, "No't loop day parameter \n");
       fprintf(stdout,"%s \n",argv[1]);
       fprintf(stdout,"%s \n",argv[2]);
       fprintf(stdout,"%s \n",argv[3]);
       fprintf(stdout,"%s \n",argv[4]);
       fprintf(stdout,"%s \n",argv[5]);
       fprintf(stdout,"%s \n",argv[6]);
       fprintf(stdout,"%s \n",argv[7]);
       fprintf(stdout,"%s \n",argv[8]);
*/
       yeari = atoi(argv[2]);
       moni  = atoi(argv[3]);
       mdayi = atoi(argv[4]);
 
houi  = atoi(argv[5]);
mini  = atoi(argv[6]);
seci  = atoi(argv[7]);
 
if ((moni == 0 ) || (moni > 12 )){
         fprintf(stdout,"\7err: month no't val\n");
         exit(0);
}
 
if ((mdayi == 0 ) || (mdayi > 31 )){
         fprintf(stdout,"\7err: day no't val\n");
         exit(0);
}
 
if ( houi > 23 ){
       fprintf(stdout,"\7err: hour no't val\n");
         exit(0);
}
 
if (( mini > 59 ) || ( seci >59 )){
         fprintf(stdout,"\7err: min & sec no't val\n");
         exit(0);
}
 
          
for (;;){
         time_t  t = time(NULL);
         struct tm *tp =  localtime(&t);
         char *s = asctime(tp);
 
 /*
fprintf(stdout,"%04d/%02d/%02d %02d:%02d:%02d \n", 1900+tp->tm_year,1+tp->
tm_mon, tp->tm_mday, tp->tm_hour, tp->tm_min, tp->tm_sec);
 */
 
        if  (( yeari == 1900+tp->tm_year) && ( moni == 1+tp->tm_mon)
 && (mdayi == tp->tm_mday ) && (houi == tp->tm_hour)
 && ( mini == tp->tm_min) && ( seci == tp->tm_sec)){
 
            execlp( argv[8], argv[8], NULL);
           exit(0);
 }

/********************************************************************************/
/*   もっと クリティカル な時間にしたい人は以下usleep()とsleep(1)を置き換えてください */
/*   100/1000秒眠って待つ 100msec usleep(100)                                  */
/*   usleep(1000 * 1000);                                                       */
/*                                                                              */
/********************************************************************************/

sleep(1);
    }
   }
 
 
/********************************************************************************/
/*                                                                              */
/*   処理 :パラメータはオプション -d のチェックと時分秒の範囲チェック                          */
/*   -d は時分秒指定で毎日 指定時間に1回のみ実効され終了するKillシグナルで停止 */
/*                                                                              */
/********************************************************************************/
               
if(( argc == 6 ) && ( argv[1][0] =='-' ) &&
 ( argv[1][1] == 'd' || argv[1][1] == 'D')){
        fprintf(stdout,"%s ",argv[1]);
        fprintf(stdout,"%s:",argv[2]);
        fprintf(stdout,"%s:",argv[3]);
        fprintf(stdout,"%s ",argv[4]);
        fprintf(stdout,"%s \n",argv[5]);
 
        houi  = atoi(argv[2]);
        mini  = atoi(argv[3]);
        seci  = atoi(argv[4]);
 
      if ( houi > 23 ){
         fprintf(stdout,"\7err: hour no't val\n");
         exit(0);
       }
 
      if (( mini > 59 ) || ( seci >59 )){
       fprintf(stdout,"\7err: min & sec no't val\n");
       exit(0);
       }
   
      for (;;){
    time_t  t = time(NULL);
struct tm *tp =  localtime(&t);
/*          char *s = asctime(tp); */
 
           fprintf(stdout,"%02d:%02d:%02d \n", tp->tm_hour,
 tp->tm_min, tp->tm_sec);
           if ((houi == tp->tm_hour) && ( mini == tp->tm_min) &&
 ( seci == tp->tm_sec)){
               system( argv[5] );

          }

/********************************************************************************/
/*   もっと クリティカル な時間にしたい人は以下usleep()とsleep(1)を置き換えてください */
/*   100/1000秒眠って待つ 100msec usleep(100)                                  */
/*   usleep(1000 * 1000);                                                       */
/*                                                                              */
/********************************************************************************/

           sleep(1);
        }
    } 
 
 
/********************************************************************************/
/*                                                                              */
/*   処理 :パラメータはオプション -w 1,2,3,4,5,6,7 のチェックと時分秒の範囲チェック            */
/*         対応順は1,2,3,4,5,6,7 日月火水木金土                                 */
/*   -w は時分秒指定で毎週 指定時間に1回のみ実効され終了Killシグナルで終了する */
/*                                                                              */
/********************************************************************************/

if (( argc == 7 ) && ( argv[1][0] =='-' ) &&
 ( argv[1][1] == 'w' || argv[1][1] =='W')){
  fprintf(stdout,"%s ",argv[1]);
        fprintf(stdout,"%s ",argv[2]);
        fprintf(stdout,"%s:",argv[3]);
        fprintf(stdout,"%s:",argv[4]);
        fprintf(stdout,"%s ",argv[5]);
        fprintf(stdout,"%s \n",argv[6]);

        weeki = atoi(argv[2]);
        houi  = atoi(argv[3]);
        mini  = atoi(argv[4]);
        seci  = atoi(argv[5]);

if ( houi > 23 ){
         fprintf(stdout,"\7err: hour no't val\n");
         exit(0);
       }

      if (( mini > 59 ) || ( seci >59 )){
        fprintf(stdout,"\7err: min & sec no't val\n");
        exit(0);
       }

      if (( weeki <0 ) || ( weeki>8 )){
        fprintf(stdout,"\7err: week-day no't val 1,2 3,4,5,6,7 \n");
        exit(0);
       }

       for (;;){
          time_t  t = time(NULL);
          struct tm *tp =  localtime(&t);
/*          char *s = asctime(tp); 

fprintf(stdout,"%02d:%02d:%02d \n", tp->tm_hour, tp->tm_min, tp->tm_sec);  */

          if ((houi == tp->tm_hour) && ( mini == tp->tm_min)
 && ( seci == tp->tm_sec)){

            system( argv[6] );

         }

/********************************************************************************/
/*   もっと クリティカル な時間にしたい人は以下usleep()とsleep(1)を置き換えてください */
/*   100/1000秒眠って待つ 100msec usleep(100)                                  */
/*   usleep(1000 * 1000);                                                       */
/*                                                                              */
/********************************************************************************/

          sleep(1);
       }
   }
}

usage()

{
      fprintf(stdout,"\7Usage : stimer -o  yyyy mm day hour min sec
 fork-program\n");
      fprintf(stdout,"      :        -d  hour min sec fork-program\n"); 
      fprintf(stdout,"      :        -w (1-7) hour min sec fork-program\n");  
      fprintf(stdout,"      :        -w 1=Sunday - W 7=Satuday hour min sec
 fork-program\n"); 
      exit(0);
}
/* end of program eof */


さっそく遊んでみましょう。
cc -o stimer stimer.c でコンパイルが通ればOKです。
オブジェクトを cp stimer /usr/local/bin/stimer にコピーして、
stimer -o 2001 01 03 12 00 00 /pcusr/tmp/sh.ftp & で、
その時間になれば、sh.ftpが実行されます。
バックグランドジョブで動かしたければ   >/dev/null &
ログをとりたければファイルへ        >/tmp/stimer.log

注意 : このプログラムは個人の責任において御試用して下さい。
私は一切の責任をとらないものとします。