/********************************************************************************/ /* */ /* 著作権は放棄しません、自由に使用・改造・再配布可能です。 */ /* 改造版を再配布する際は、必ずファイル名を変更して、オリジナルを添付して */ /* 配布してください。 */ /* */ /* プログラム名 : 定期日付時間指定でプログラムを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 #include 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回のみ実効され終了シグナルで終了する */ /* */ /********************************************************************************/ 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] ); /* execlp( argv[5], argv[5], NULL); */ } /********************************************************************************/ /* もっと クリティカル な時間にしたい人は以下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回のみ実効され終了シグナルで終了する */ /* */ /********************************************************************************/ 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] ); /* execlp( argv[6], argv[6], NULL); */ } /********************************************************************************/ /* もっと クリティカル な時間にしたい人は以下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 */