`

linux系统下通过shell脚本快速找到哪个进程在写文件

阅读更多

一个文件正在被进程写 我想查看这个进程 文件一直在增大 找不到谁在写 使用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脚本中获取进程ID的方法

    比如,你可以使用shell脚本的PID在/tmp下创建一个唯一的临时文件。有时侯脚本需要检测所有运行的进程,它可以从进程列表中排除自身的子shell。 在bash中,子shell进程的PID存储在一个特殊的变量‘$$’中。这个变量...

    Shell脚本实现Linux系统和进程资源监控

    主要介绍了Shell脚本实现Linux系统和进程资源监控,本文讲解了检查进程是否存在、检测进程 CPU 利用率、检测进程内存使用量、检测进程句柄使用量、,需要的朋友可以参考下

    Shell脚本中让进程休眠的方法(sleep用法)

    有时候写Shell的脚本,用于顺序执行一系列的程序。 有些程序在停止之后并没能立即退出,就例如有一个 tomcat 挂了,就算是用 kill -9 命令也还没瞬间就结束掉。 这么如果 shell 还没等其退出就接着执行下一行,这么...

    linux测试使用shell并发脚本

    linux测试使用shell并发脚本,这个只是一个脚本!

    查看系统进程的shell脚本

    查看系统进程的shell脚本 比较简单,但是包含程序的各种元素,可以作为初学者的例子。<linux编程从入门到精通>中的例子

    shell脚本——自动杀死进程

    Linux系统下自动匹配进程号,并杀死进程的shell脚本...

    Linux环境通过shell脚本筛选进程PID打印

    Linux环境,查看JAVA进程,根据进程号筛选JAVA进程,通过shell脚本筛选PID 这里可以学到awk截取字段的用法,wl统计个数的方法,以及$~匹配指定值的方法 以及通过命令获取值作为变量传递,以及通过if判断统计进程个数...

    Linux Shell脚本编程

    实验任务一:编写一个Shell过程完成如下功能(必须在脚本中使用函数):1、程序接受3个参数:$1、$2和$3,合并两个$1、$2文件为$3,并显示,三个文件均为文本文件。2、如果缺少$3,那么先报告缺少$3,然后将合并后的...

    Linux守护进程shell脚本

    linux守护进程shell脚本,可检测当前目录下需要守护的程序是否已经执行,如果已经执行,只需守护,如果没运行,会自动启动程序并进行守护。 其他目录下同名的程序运行不影响当前目录的进程守护。 具体用法,放到需要...

    使用Shell脚本对Linux系统和进程资源进行监控.docx

    使用Shell脚本对Linux系统和进程资源进行监控.docx使用Shell脚本对Linux系统和进程资源进行监控.docx

    Shell脚本专家指南

    《Shell脚本专家指南》旨在为Linux、Unix以及OSx系统管理员提供短小精悍且功能强大的shell实现解决方案,教会读者如何使用现有调试器调试shell脚本。全书分为3个部分:脚本技术基础、系统交互和高级技术、有用的脚本...

    常用shell 脚本,dos攻击防范,

    常用shell脚本, Dos攻击防范(自动屏蔽攻击IP).sh 一键部署等等 Linux系统发送告警脚本.sh MySQL数据库备份单循环.sh MySQL数据库备份多循环.sh nginx 访问访问日志按天切割.sh nginx.conf nginx访问日志分析...

    Linux Shell 网络层监控脚本(监控包括:连接数、句柄数及根据监控反馈结果分析)

    Linux Shell 网络层监控脚本(监控包括:连接数、句柄数及根据监控反馈结果分析)

    linux中,用shell脚本检查磁盘使用率并清理文件

    (2)另一种情况是该文件以长时间没有写操作,没有其他进程以写的方式在打开它,可以直接删除,以rm的方式清理。 4、上述两种情况分别以两个shell函数实现,有入参,可任意调节入参。 5、这两个函数的第一个参数是...

    linux上检查进程IO的SHELL脚本

    Linux Kernel 2.6.20 以上的内核支持进程 IO 统计,可以用类似 iotop 这样的工具来监测每个进程对 IO 操作的情况,就像用 top 来实时查看进程内存、CPU 等占用情况那样。但是对于 2.6.20 以下的 Linux 内核版本就没...

    shell 写的守护进程

    该脚本可以在后台启动守护进程和被守护的进程。 修改脚本内的APPNAME变量的值指定被守护的可执行程序文件。使用 ./ctl.sh start 启动守护进程和被守护进程。使用./ctl.sh stop停止守护进程和被守护进程。

    linux经典的自动化运维shell脚本 checkNmp_abiao.rar

    经典的自动化运维脚本 checkNmp abiao原创,可以实现在nginx宕机时候杀死进程让它自动重启,在php挂掉或者502状态时候,自动检测到服务资源异常,杀死进程重启服务,MySQL重启服务等等、、、

    学习笔记《LINUX+SHELL脚本攻略》Sarath Lakshman

    数也能像环境变量一样用export到处,如此,函数的作用域就可以扩展到子进程中。 export -f fname Linux export命令用于设置或显示环境变量。 在shell中执行程序时,shell会提供一组环境变量。export可新增,修改...

Global site tag (gtag.js) - Google Analytics