小干货:Linux如何查看文件是被那个进程占用写数据?
文件被那个进程使用,写数据不是用lsof可以找出来吗,但现实情况是lsof没找出来。
背景
centos7 在某一段时间监控报警磁盘使用率达99%,由于监控属于概要形式信息,没有快照信息的监控(能发现某进程的I/O,CPU消耗情况),所以需要在服务器上去定时执行统计命令获取快照信息。
需要通过iostat -dx -k去查看avgqu-sz、await、svctm、%util;
sar -u查看%iowait、%user;
pidstat -d 查看进程I/O读写的快照信息
步骤
生成统计信息文件
在while循环中使用iostat的原因是要输出date +%T时间,不然只有数据,没有时间信息也没有什么用
使用at 命令定时执行
at 15:14 today -f /tmp/at_task.sh
出现错误
Can't open /var/run/atd.pid to signal atd. No atd running?
重启atd服务
service atd restart
重新开启at定时任务
得到如下快照信息
iostat
sar
pidstat
kill 掉收集信息的命令
但ps -ef | egrep 命令没有获取到while循环的pid,不kill掉该while循环,就会一直对/tmp/iostat_2019-03-13写数据-_-
通过lsof 没有定位到打开文件的进程
通过lsof 可以定位到打开mysql-error.log的进程
可见,某进程只有一只持有某文件的inode,才可以通过lsof查看文件在被那些进程使用
获取写文件的进程号
安装sysemtap
yum -y install systemtap
SystemTap 是对 Linux 内核监控和跟踪的工具
利用systemtap中的inodewatch.stp工具来查找写文件的进程号
得到文件的inode
获取文件所在设备的major,minor
得到写文件的pid
根据系统内核版本在kernel-devel rpm build for : Scientific Linux 7网站上下载相应的kernal-devel包
再次执行stap
安装debuginfo kernal
再次执行stap
添加 -v查看详细报错
修改
再次执行
可见已经得到了写/tmp/iostat_date +%F 文件的进程号,但进程号一直在打印出来,因为后台进程iostat -dx -m 的在while循环中的,每隔sleep 2s 后就会执行一次iostat 产生新的pid。
那要怎样才能让iostat -dx -m 停止写/tmp/iostat_date +%F 文件了?除了重启大法好 $_$
rm -rf 也不能终止后台的while iostat进程写文件,删除了文件后,while循环又会生成新的文件
正确做法