概述:从linux系统中记录用户登入登出的文件中,读取数据,整理用户登入和登出的时间,和在线的时长,最后写入到oracle数据库。整个程序由客户端和服务端组成。客户端部署在客户机上,用于采集客户机上用户的登入登出信息。服务端部署在可以连接到oracle数据库的主机上,用于整理数据,和向数据库插入数据。
涉及到的知识点:
socket网络编程
动态库的制作
Makefile文件制作
proc
流程描述:
客户端程序,通过操作utmp文件的一套库函数,从/var/log/wtmp文件中逐个读取记录。筛选出用户登入和登出记录,分别保存到登入和登出的链表中。
读取完毕之后,根据登出的链表的每一个记录中的pid信息到登入的链表中寻找对应的登入记录。如果找不到,说明这个登出记录无效,直接从链表中删除;如果找到了对应的登入记录,则将这一对登入和登出信息封装成一个自定义的信息类,包含用户名,用户登入时间,用户登出时间,在线时间,将其插入到自定义类链表中。并将这一对信息,从登入和登出链表中弹出。
在采集数据时,很有可能客户机上还有用户处于在线状态,仅生成了一条登入的记录,没有登出数据。对于这些数据,将会被保存在文件中,下一次客户端程序运行时会被加入到登入的队列中,参与下一次的匹配。
通过socket函数,建立TCP协议的通信,将数据发送到服务端。如果服务端不可达,或者其他原因而导致发送失败,客户端会将数据写入到一个文件中,在下一次发送时将先加载这些发送失败的数据,一起发送。
服务端:
收到客户端的信息之后,对数据进行处理,例如,将登入登出的时间转换成oracle的date类型。然后链接数据,向数据库表中插入这些信息。服务端的接收信息和插入数据库两个动作是放在两个线程中的,两个线程共同维护一条队列,采用生产者-消费者模式。