📄 relog.cpp
字号:
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <sys/msg.h>
#include <sys/socket.h>
#include <sys/errno.h>
#include <sys/signal.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/signal.h>
#include <sys/time.h>
#include <time.h>
#include <sys/stat.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <ctype.h>
#include <unistd.h>
#include <stdarg.h>
#include <fcntl.h>
#include <stdio.h>
#include <dirent.h>
void* safe_signal(int signo, void *func);
int getNow(char *stime);
int getSomeDay(char *stime, int days);
int read_logList_conf(char *fname);
typedef struct
{
char filename[128];
int maxsize;
} logList_t;
logList_t *gd_logList;
int listLen;
int main(int argc, char **argv)
{
int childpid;
int i;
int ret;
int pid;
int stau;
struct stat fbuf;
char fullname[256];
char stime[16];
char cmd[256];
if (argc != 2)
{
printf("Usage:\n");
printf(" relog <日志列表配置文件>\n");
exit(1);
}
ret = read_logList_conf(argv[1]);
if (ret < 0) exit(1);
if (fork() > 0) exit(0);
safe_signal(SIGHUP, (void *)SIG_IGN);
safe_signal(SIGINT, (void *)SIG_IGN);
safe_signal(SIGPIPE, (void *)SIG_IGN);
for (;;)
{
for (i=0; i<listLen; i++)
{
strcpy(fullname, gd_logList[i].filename);
memset(&fbuf, 0, sizeof(struct stat));
ret = stat(fullname, &fbuf);
if (ret != 0)
{
printf("In stat fullname[%s], errno[%d:%s]\n", gd_logList[i].filename, errno, strerror(errno));
continue;
}
if (fbuf.st_size > gd_logList[i].maxsize)
{
getNow(stime);
sprintf(cmd, "cp %s %s.%s", fullname, fullname, stime);
system(cmd);
getSomeDay(stime, -10);
sprintf(cmd, "rm -f %s.%s", fullname, stime);
system(cmd);
sprintf(cmd, "echo>%s", fullname);
system(cmd);
}
}
sleep(20);
}
}
int ltrim(char *str)
{
int len;
len = strlen(str);
if (len == 0) return 0;
while (str[0] == ' ')
{
if (len == 1)
{
str[0] = 0;
break;
}
memcpy(str, &(str[1]), len-1);
str[len-1] = 0;
len = strlen(str);
if (len == 0) break;
}
return 0;
}
int read_logList_conf(char *fname)
{
int ret;
int i;
FILE *fp;
char aline[1024];
char field1[128];
char field2[128];
fp = fopen(fname, "r");
if (fp == NULL)
{
printf("读取日志列表配置文件[%s]出错,错误[%d:%s]\n", fname, errno, strerror(errno));
return -1;
}
i = 0;
for (;;)
{
memset(aline, 0, sizeof(aline));
fgets(aline, sizeof(aline)-1, fp);
if ( feof(fp) ) break;
strtok(aline, "");
if (strlen(aline) == 0) continue;
ltrim(aline);
if (strlen(aline) == 0) continue;
if (strcmp(aline, "\r") == 0) continue;
if (strcmp(aline, "\n") == 0) continue;
if (strcmp(aline, "\r\n") == 0) continue;
//若为注释
if (aline[0] == '#') continue;
memset(field1, 0, sizeof(field1));
memset(field2, 0, sizeof(field2));
sscanf(aline, "%s%s", field1, field2);
//printf("[%s]\n", field1);
if (strlen(field1) > 127)
{
printf("[%s]超过127字符错误!\n", field1);
return -1;
}
i ++;
}
rewind(fp);
listLen = i;
gd_logList = (logList_t *)calloc(sizeof(logList_t), i);
i = 0;
for (;;)
{
memset(aline, 0, sizeof(aline));
fgets(aline, sizeof(aline)-1, fp);
if ( feof(fp) ) break;
strtok(aline, "");
if (strlen(aline) == 0) continue;
ltrim(aline);
if (strlen(aline) == 0) continue;
if (strcmp(aline, "\r") == 0) continue;
if (strcmp(aline, "\n") == 0) continue;
if (strcmp(aline, "\r\n") == 0) continue;
//若为注释
if (aline[0] == '#') continue;
memset(field1, 0, sizeof(field1));
memset(field2, 0, sizeof(field2));
sscanf(aline, "%s%s", field1, field2);
printf("[%s][%s]\n", field1, field2);
strcpy(gd_logList[i].filename, field1);
gd_logList[i].maxsize = atoi(field2);
i ++;
if (i == listLen) break;
}
fclose(fp);
return 0;
}
void* safe_signal(int signo, void *func)
{
struct sigaction act, oact;
act.sa_handler = (void (*)(int))func;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
if (signo == SIGALRM)
{
#ifdef SA_INTERRUPT
act.sa_flags |= SA_INTERRUPT; /*sun os*/
#endif
}
else
{
#ifdef SA_RESTART
act.sa_flags |= SA_RESTART; /*svr4, 4.3+bsd*/
#endif
}
if (sigaction(signo, &act, &oact) < 0)
return (void *)(SIG_ERR);
return (void *)(oact.sa_handler);
}
/*getNow--取得当前日期和时间
Argument:
ascday--YYYYMMDD格式
asctm--HHMMSS格式
*/
int getNow(char *stime)
{
time_t t;
struct tm * tm1;
char ascday[9];
char asctm[7];
t = time(NULL);
tm1 = localtime(&t);
sprintf(ascday,"%04d",tm1->tm_year+1900);
sprintf(ascday+4,"%02d",tm1->tm_mon+1);
sprintf(ascday+6,"%02d",tm1->tm_mday);
sprintf(asctm,"%02d",tm1->tm_hour);
sprintf(asctm+2,"%02d",tm1->tm_min);
sprintf(stime, "%s%s", ascday+4, asctm);
return 0;
}
/*getNow--取得当前日期和时间
Argument:
ascday--YYYYMMDD格式
asctm--HHMMSS格式
*/
int getSomeDay(char *stime, int days)
{
time_t t;
struct tm * tm1;
char ascday[9];
char asctm[7];
t = time(NULL);
t += days*24*60*60;
tm1 = localtime(&t);
sprintf(ascday,"%04d",tm1->tm_year+1900);
sprintf(ascday+4,"%02d",tm1->tm_mon+1);
sprintf(ascday+6,"%02d",tm1->tm_mday);
sprintf(asctm,"%02d",tm1->tm_hour);
sprintf(asctm+2,"%02d",tm1->tm_min);
sprintf(stime, "%s*", ascday+4);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -