日志分析系统开发笔记

来源:互联网 发布:酷家乐软件多少钱 编辑:程序博客网 时间:2024/05/16 08:27

1 任务监控进程
1.1 JAVA
任务管理进程,周期查询数据库,根据数据库对应的表信息对任务进行管理。包括定时拉起进程等。

1.2 C任务管理器,1.3 
根据配置文件,拉起进程,拉起前根据文件锁来确定进程的唯一性。每次拉起进程,把进程号放到数组表中,任务管理器中child_pid=wait(&istatus);当其管理的子进程结束时,就会得到child_pid,根据child_pid到数组表检索具体的应用信息,重新拉起,重设数组中对应应用的pid信息。

1.3.1 监控进程一启动就把自己放到后台
If (pid=for()==0)
{
…..
}
else  exit(0);
1.3.2 安装监视子进程信号,1.3.3 安装父进程退出函数
signal(SIGPIPE, SIG_IGN);
signal(SIGINT,SIG_IGN);
signal(SIGTERM, kill_process);
signal(SIGUSR2, kill_process);//安装退出

signal(SIGCHLD, repear);//安装重拉子进程
1.3.4 读取配置文件进行进程拉起
拉进程:
start_app(int iIndex)
chid_pid==0;
chid_pid=getpid();
if (chid_pid < 0) perror;
else if(chid_pid == 0)
{
 子进程,安装退出函数,调用应用程序
 signal(SIGCHLD, SIG_IGN);该信号供父进程监视子进程退出使用
 signal(SIGUSR2, quit)
  elecl(g_process_info[iIndex].path, g_process_info[iIndex].arg1, NULL);拉应用程序
}
{
 //父进程存储子进程号
 g_process_info[iIndex].pid = chid_pid;
sleep(5) ;//拉进程太快了可能被操作系统杀死。
}

chid_pid=execl(const char *path,const char *arg,...);
把chid_pid存入进程信息表中对应的进程记录里

1.3.5 锁文件:
fd=open(filename, O_RDWR|OCREATE, S_IRUSR| S_IWUSR | S_IRGRP |S_IWGRP);
struct flag;
flag.l_type=F_WRLCK,
flag.l_where=SEEK_SET;
flag.l_start=SEEK_SET;
flag.l_len=SEEK_SET;
flag.l_pid=getpid();
return fcntl(fd,F_SETLK,& flag);
当进程退出时自动释放锁。

1.3.6 把退出的子进程重新拉起。
Repear()

Child_pid=wait(&istatus);重新拉起进程
Search in  if (g_process_info[iIndex].pid == chid_pid)
重拉:start_app(iIndex)

1.3.7 退出的shell命令

把自己的进程号写入一个文件中,通过shell脚本来退出进程
 $ kill -INT `head -1 /usr/local/pgsql/data/postmaster.pid`

1.3.8 退出函数
父亲:kill_process (){kill(0, SIGUSR2); exit(1);}
孩子:quit(){exit(1);}
1.3.9 子程序使用目录必须是绝对路径
可通过环境变量设置根目录,如
char *szHome = getenv(”HOME”);

2 PROC
2.1 连接池
static int s_iCurThreadNo=-1;
EXEC SQL BEGIN DECLARE SECTION
static sql_context  s_connect[MAXTHREAD_NUM];
EXEC SQL END DECLARE SECTION

构造函数中
m_iCurThread = ++ iCurThreadNo;
EXEC SQL CONTEXT ALLOCATE s_connect[m_iCurThread];

初始化函数中
EXEC SQL ENABLE THREADS. 必须只有一次!否则会内存泄漏。

在每个涉及PROC的函数,都要使用
EXEC SQL CONTEXT USE : s_connect[m_iCurThread];

2.2 动态sql
INSET和UPDATE的FOR用法
EXEC SQL PREPARE stat_insert FROM :szSQL;
EXEC SQL FOR :nToDo EXECUTE stat_insert USING :val1, :val2;

SELECT的动态slq用法
EXEC SQL PREPARE stat_select FROM :szSQL;
EXEC SQL OPEN cursor_select FOR stat_select;
EXEC SQL FETCH cursor_select INTO :aVal1, aVal2;
EXEC SQL CLOSE cursor_select;

2.3 常用错误码
LOGOFF –1012
NOTCONN –3114
NOFOUND 1403

EXEC SQL OPEN cursor_select FOR stat_select;
EXEC SQL PREPARE stat_select FROM :szSQL;
EXEC SQL PREPARE stat_select FROM :szSQL;
2.4 基本语法
每个函数都要定义局部变量struct sqlca sqlca;
EXEC SQL COMMIT WORK; WORK RELEASE; ROLLBACK;ROLLBACK RELEASE;
3.使用FETCH游标时,如果后面还有数据库操作。必须当时就要对sqlcode进行判断做标志,否撒sqlcode会被覆盖。
4. 一个工程中使用多个.pc文件,除了一个文件外,其余的都要通过#define SQLCA_STORAGE_CLASS extern来保护sqlca.h头文件
2.5 配置
pcscfg..cfg  proc的配置文件,需要把g++等内容配置进去
network/admin/tnsnames.ora PROC连接的配置文件

$HOME/.bash_profig
LD_LIBRARY_PATH=$ORACLE_HOME/lib
JAVA配置
CLASSPATH=$ORACLE_HOME/JRE: $ORACLE_HOME/jlib
export JAVA_HOME=/usr/local/jdk
export PATH= JAVA_HOME/BIN:$PATH
export CLASSPATH = $JAVA_HOME/jre/lib/nt.jar:
模块功能

重连重试,必须重新申请上下文,否则可能会有问题。
3 C函数集
stat查询文件释放存在和文件类型(目录还是文件)
rename 移动文件
mkdir  创建目录,getoken(Token=/, vector<string> vTokens)
第一次通过stat遍历vTokens,得到第一个待创建的token
第二从该token开始往深层创建目录
scanfdir 根据函数扫描目录,可以过滤得到想要的文件,比如只提取目录,或文件,或仅仅压缩文件
rmdir(绝对路径):scanfdir,把所有文件类型的删除,scanfdir,把所有目录(绝对路径)递归调用rmdir。最后调用chdir到上层删除本目录,不要用..之类的,(因为在多线程中,环境变量随时会改变????)
chdir  切换目录,在解压时,都需要该函数来切换到包的目录中,才调用system解压,否则会出问题的。
statfs 获取磁盘信息
<sys/statfs.h>
struct statfs dis_statfs;
statfs(“/”,& dis_statfs);
int persent =(double (.f_blocks – .f_free))/ (double).f_blocks))*100


有些信号是你内部进程发生错误产生,是不能SIG_IGN,必须阻塞它,否则程序会异常退出 

原创粉丝点击