文件读写监控(inotify, systemtap)
#include <stdio.h>
#include <stdlib.h>
#include <sys/inotify.h>
#include <errno.h>
#include <string.h>
#include <sys/epoll.h>
int main(void)
{
char *filename = "./log.txt";
int inoti_fd = inotify_init1(IN_CLOEXEC);
if (inoti_fd == -1) {
printf("inotify_init failed, %s\n", strerror(errno));
exit(-1);
}
int file_fd = inotify_add_watch(inoti_fd, filename, IN_ALL_EVENTS);
if (file_fd == -1) {
printf("inotify_add_watch failed, %s\n", strerror(errno));
exit(-1);
}
int epoll_fd = epoll_create(5);
if (epoll_fd == -1) {
printf("epoll_create failed, %s\n", strerror(errno));
goto end;
}
struct epoll_event ev, event[5];
memset(&ev, 0, sizeof(ev));
ev.events = EPOLLIN | EPOLLET;
ev.data.fd = inoti_fd;
if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, inoti_fd, &ev) == -1) {
printf("epoll_ctl failed, %s\n", strerror(errno));
goto end;
}
int buf_size = sizeof(struct inotify_event) + 64 * sizeof(char);
struct inotify_event * instance = malloc(buf_size);
memset(instance, 0, buf_size);
int value = 0;
while ((value = epoll_wait(epoll_fd, event, 5, -1)) != -1) {
int i = 0;
for (i = 0; i < value; i ++) {
if (event[i].data.fd == inoti_fd) {
if (read(inoti_fd, instance, buf_size) > 0)
printf("file_id is %d, event is %u, cookie is %u, name is %s\n",
instance->wd, instance->mask, instance->cookie, instance->name);
else
printf("read inoti_fd failed, %s\n", strerror(errno));
}
else
printf("unknown file_fd %d\n", event[i].data.fd);
}
}
end:
inotify_rm_watch(inoti_fd, file_fd);
return 0;
#!/usr/bin/python
import logging
from inotify import adapters
_DEFAULT_LOG_FORMAT = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
_LOGGER = logging.getLogger(__name__)
def _configure_logging():
_LOGGER.setLevel(logging.DEBUG)
ch = logging.FileHandler('./record', 'a')
formatter = logging.Formatter(_DEFAULT_LOG_FORMAT)
ch.setFormatter(formatter)
_LOGGER.addHandler(ch)
def _main():
i = adapters.Inotify()
i.add_watch('/var/lib/logrotate.status')
for event in i.event_gen():
if event:
(header, type_names, watch_path, filename) = event
print ("WD=(%d) MASK=(%d) COOKIE=(%d) LEN=(%d) MASK->NAMES=%s WATCH-PATH=[%s] FILENAME=[%s]",\
header.wd, header.mask, header.cookie, header.len, type_names, watch_path.decode('utf-8'), filename.decode('utf-8'))
_LOGGER.info("WD=(%d) MASK=(%d) COOKIE=(%d) LEN=(%d) MASK->NAMES=%s WATCH-PATH=[%s] FILENAME=[%s]",\
header.wd, header.mask, header.cookie, header.len, type_names, watch_path.decode('utf-8'), filename.decode('utf-8'))
if __name__ == '__main__':
_configure_logging()
_main()
#监控log.txt发生的操作,并输出到record文件中,另外inotifywait命令的-r选项支持递归遍历
$ inotifywait -m log.txt -o record
#inotifywatch 命令则用于统计一段时间内,某个文件所发生操作的统计数据
#上述的两个命令的具体用法参照man手册
$ yum install systemtab -y
$ yum install kernel-debug-debuginfo #stap监控系统调用需要
$ stap -ve 'probe begin { log("hello world") exit() }' #测试stap是否安装成功
$ ls -i log.txt #查看要监控文件的inode号 2360637
$ df -h #查看log.txt所在的磁盘分区
$ cat /proc/partitions #查看各个磁盘分区的major、minor号 8 2
$ stap /usr/share/doc/systemtap-1.6/examples/io/inodewatch.stp 0x8 0x2 2360637 #监控log.txt即(0x8 0x2 2360637)所进行的操作,同时会显示出执行操作的进程ID
文件读写监控(inotify, systemtap)的更多相关文章
- Linux 文件操作监控inotify功能及实现原理【转】
转自:http://blog.chinaunix.net/uid-26585427-id-5012973.html 1. inotify主要功能 它是一个内核用于通知用户空间程序文件系统变化的机制. ...
- 使用pt-ioprofile监控数据库io文件读写情况
我们在做IO密集型的应用程序的时候,比如MySQL数据库,通常系统的表现取决于workload的类型. 比如我们要调优,我们就必须非常清楚的知道数据的访问规律,收集到足够的数据,用来做调优的依据. 有 ...
- Linux下使用inotify实现对文件的监控
项目中,要实现用户通过网页设置參数,后台接收数据然后写串口. 网页写数据到本地文件,使用inotify监控文件的IN_MODIFY事件.当文件被改动,然后触发写串口事件. 第一个程序只把要监控的文件增 ...
- IO异步,读写压缩文件,监控文件系统
这节结尾IO,讲一下异步操作文件,读写压缩文件,监控文件系统这三个知识点. 异步操作文件: 说到异步,必然要了解的是async和await这两个关键字(异步详情点击基于任务的异步编程(Task ...
- Sersync实现触发式文件同步 替代inotify和rsync
Sersync实现触发式文件同步 替代inotify和rsync Pyinotify是一个Python模块,用来监测文件系统的变化. Pyinotify依赖于Linux内核的功能—inotify(内核 ...
- python学习之文件读写,序列化(json,pickle,shelve)
python基础 文件读写 凡是读写文件,所有格式类型都是字符串形式传输 只读模式(默认) r f=open('a.txt','r')#文件不存在会报错 print(f.read())#获取到文件所 ...
- 【Win 10 应用开发】文件读写的三种方案
本文老周就跟伙伴们探讨一下关于文件读写的方法.总得来说嘛,有三种方案可以用,而且每种方案都各有特色,也说不上哪种较好.反正你得记住老祖宗留给我们的大智慧——事无定法,灵活运用者为上. OK,咱们开始吧 ...
- c语言文件读写操作总结
C语言文件读写操作总结 C语言文件操作 一.标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程 ...
- ActionScript 3.0入门:Hello World、文件读写、数据存储(SharedObject)、与JS互调
近期项目中可能要用到Flash存取数据,并与JS互调,所以就看了一下ActionScript 3.0,现把学习结果分享一下,希望对新手有帮助. 目录 ActionScript 3.0简介 Hello ...
随机推荐
- 【转】50条大牛C++编程开发学习建议
每个从事C++开发的朋友相信都能给后来者一些建议,但是真正为此进行大致总结的很少.本文就给出了网上流传的对C++编程开发学习的50条建议,总结的还是相当不错的,编程学习者(不仅限于C++学习者)如果真 ...
- runat="server"
加runat="server"表示该控件是服务器端控件,不加表示是客户端控件. runat="server"直接回交服务器,处理数据,又以数据加密后的hidde ...
- Python3基础 使用 in notin 查询一个字符是否指定字典的键或者值
镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...
- 使用MyEclipse开发第一个Web程序
MyEclipse环境配置 首先,安装一个MyEclipse,然后进行一些相关的环境配置(Window->Preferences): 比如字体.Formatter等. 也可以从Eclipse中导 ...
- 使用python爬虫抓站的一些技巧总结:进阶篇
Reference:http://python.jobbole.com/82000/ 一.gzip/deflate支持 现在的网页普遍支持gzip压缩,这往往可以解决大量传输时间,以VeryCD的主页 ...
- 解决mysql 1032 主从错误
1032错误----现在生产库中好多数据,在从库误删了,生产库更新后找不到了,现在主从不同步了,再跳过错误也没用,因为没这条,再更新还会报错 临时解决方案 mysql> stop slave; ...
- Android Studio快捷键汇总
- MySQL XtraBackup自动恢复脚本
#!/bin/sh ################## #author:rrhelei@126.com# ################## #xtrabackup2.1.8 # 使用方法: ...
- 计算数据库中30天以内,30-60天,60-90天,90天以外的数据的个数(用sql实现)
30天以内:select count(*) from TB where datediff(day,字段名,getdate()) between 0 and 3030-60天:select count( ...
- 动态加载css方法实现和深入解析
一.方法引用来源和应用 此动态加载css方法 loadCss,剥离自Sea.js,并做了进一步的优化(优化代码后续会进行分析). 因为公司项目需要用到懒加载来提高网站加载速度,所以将非首屏渲染必需 ...