一个文件正在被进程写 我想查看这个进程 文件一直在增大 找不到谁在写 使用lsof也没找到
这个问题挺有普遍性的,解决方法应该很多,这里我给大家提个比较直观的方法。
linux下每个文件都会在某个块设备上存放,当然也都有相应的inode, 那么透过vfs.write我们就可以知道谁在不停的写入特定的设备上的inode。
幸运的是systemtap的安装包里带了inodewatch.stp,位于/usr/local/share/doc/systemtap/examples/io目录下,就是用来这个用途的。
我们来看下代码:
$ cat inodewatch.stp #! /usr/bin/env stap probe vfs.write, vfs.read {# dev and ino are defined by vfs.write and vfs.readif(dev == MKDEV($1,$2)# major/minor device&& ino == $3) printf ("%s(%d) %s 0x%x/%u\n", execname(), pid(), probefunc(), dev, ino)}
这个脚本的使用方法如下: stap inodewatch.stp major minor ino
下面我们构造个场景: dd不停的写入一个文件,查出这个文件的ino, 以及它所在设备的major, minor, 运行stap脚本就可以得到答案。
场景交代好了,我们来演示下:
$ pwd /home/chuba $ df Filesystem1K-blocks UsedAvailableUse%Mounted on .../dev/sdb1 162124533682520956871368123654%/home ... $ ls -al /dev/sdb1 brw-rw----1 root disk 8,17Oct2411:22/dev/sdb1 $ rm -f test.dat && dd if=/dev/zero of=test.dat ^C9912890+0 records in9912890+0 records out5075399680 bytes (5.1 GB) copied,26.8189 s,189 MB/s
这个终端模拟文件的不停写入,同时在另外一个终端查验谁干的。这里我们已经知道设备的major/minor为8/17
$ stat -c '%i' test.dat 25337884 $ sudo stap /usr/local/share/doc/systemtap/examples/io/inodewatch.stp 81725337884 dd(740) vfs_write 0x800011/25337884 dd(740) vfs_write 0x800011/25337884 dd(740) vfs_write 0x800011/25337884 dd(740) vfs_write 0x800011/25337884 dd(740) vfs_write 0x800011/25337884 dd(740) vfs_write 0x800011/25337884...
看到了吧,dd是罪魁祸首,pid是740, 搞定收工!
小结: systemtap处理这种问题很是神器。
转自:http://outofmemory.cn/code-snippet/36042/linux-check-file-write-by-which-process
相关推荐
比如,你可以使用shell脚本的PID在/tmp下创建一个唯一的临时文件。有时侯脚本需要检测所有运行的进程,它可以从进程列表中排除自身的子shell。 在bash中,子shell进程的PID存储在一个特殊的变量‘$$’中。这个变量...
主要介绍了Shell脚本实现Linux系统和进程资源监控,本文讲解了检查进程是否存在、检测进程 CPU 利用率、检测进程内存使用量、检测进程句柄使用量、,需要的朋友可以参考下
有时候写Shell的脚本,用于顺序执行一系列的程序。 有些程序在停止之后并没能立即退出,就例如有一个 tomcat 挂了,就算是用 kill -9 命令也还没瞬间就结束掉。 这么如果 shell 还没等其退出就接着执行下一行,这么...
linux测试使用shell并发脚本,这个只是一个脚本!
查看系统进程的shell脚本 比较简单,但是包含程序的各种元素,可以作为初学者的例子。<linux编程从入门到精通>中的例子
Linux系统下自动匹配进程号,并杀死进程的shell脚本...
Linux环境,查看JAVA进程,根据进程号筛选JAVA进程,通过shell脚本筛选PID 这里可以学到awk截取字段的用法,wl统计个数的方法,以及$~匹配指定值的方法 以及通过命令获取值作为变量传递,以及通过if判断统计进程个数...
实验任务一:编写一个Shell过程完成如下功能(必须在脚本中使用函数):1、程序接受3个参数:$1、$2和$3,合并两个$1、$2文件为$3,并显示,三个文件均为文本文件。2、如果缺少$3,那么先报告缺少$3,然后将合并后的...
linux守护进程shell脚本,可检测当前目录下需要守护的程序是否已经执行,如果已经执行,只需守护,如果没运行,会自动启动程序并进行守护。 其他目录下同名的程序运行不影响当前目录的进程守护。 具体用法,放到需要...
使用Shell脚本对Linux系统和进程资源进行监控.docx使用Shell脚本对Linux系统和进程资源进行监控.docx
《Shell脚本专家指南》旨在为Linux、Unix以及OSx系统管理员提供短小精悍且功能强大的shell实现解决方案,教会读者如何使用现有调试器调试shell脚本。全书分为3个部分:脚本技术基础、系统交互和高级技术、有用的脚本...
常用shell脚本, Dos攻击防范(自动屏蔽攻击IP).sh 一键部署等等 Linux系统发送告警脚本.sh MySQL数据库备份单循环.sh MySQL数据库备份多循环.sh nginx 访问访问日志按天切割.sh nginx.conf nginx访问日志分析...
Linux Shell 网络层监控脚本(监控包括:连接数、句柄数及根据监控反馈结果分析)
(2)另一种情况是该文件以长时间没有写操作,没有其他进程以写的方式在打开它,可以直接删除,以rm的方式清理。 4、上述两种情况分别以两个shell函数实现,有入参,可任意调节入参。 5、这两个函数的第一个参数是...
Linux Kernel 2.6.20 以上的内核支持进程 IO 统计,可以用类似 iotop 这样的工具来监测每个进程对 IO 操作的情况,就像用 top 来实时查看进程内存、CPU 等占用情况那样。但是对于 2.6.20 以下的 Linux 内核版本就没...
该脚本可以在后台启动守护进程和被守护的进程。 修改脚本内的APPNAME变量的值指定被守护的可执行程序文件。使用 ./ctl.sh start 启动守护进程和被守护进程。使用./ctl.sh stop停止守护进程和被守护进程。
经典的自动化运维脚本 checkNmp abiao原创,可以实现在nginx宕机时候杀死进程让它自动重启,在php挂掉或者502状态时候,自动检测到服务资源异常,杀死进程重启服务,MySQL重启服务等等、、、
数也能像环境变量一样用export到处,如此,函数的作用域就可以扩展到子进程中。 export -f fname Linux export命令用于设置或显示环境变量。 在shell中执行程序时,shell会提供一组环境变量。export可新增,修改...