在某个进程使用文件时,我们通常可以使用lsof来查找写入数据的进程。但是,在某些情况下,lsof并不能找到相关信息。例如,在centos 7系统中,当监控报告磁盘使用率达到99%时,我们需要在服务器上定时执行统计命令来获取快照信息,以便更好地了解系统的运行情况。我们可以使用iostat -dx -k命令来查看avgqu-sz、await、svctm和%util等指标,使用sar -u命令来查看%iowait和%user指标,以及使用pidstat -d命令来查看进程i/o读写的快照信息。
步骤
- 生成统计信息文件
cat>/tmp/at_task.sh/tmp/pidstat_`date +%F_%T`.log 2>& 1 & sar -u 2 >/tmp/sar_`date +%F_%T`.log 2>& 1 & while [ 1 ];do echo -n `date +%T` >>/tmp/iostat_`date +%F` 2>& 1 && iostat -dx -k 1 1 >>/tmp/iostat_`date +%F` 2>& 1; sleep 2; done & EOF登录后复制
“
在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定时任务
“
at 15:14 today -f /tmp/at_task.sh
job 2 at Wed Mar 13 15:14:00 2019”
得到如下快照信息
iostat
15:13:35Linux 3.10.0-862.14.4.el7.x86_64 (ip-xxxxx) 03/13/2019 _x86_64_ (4 CPU) Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util vda 0.12 0.07 17.31 19.41 580.79 90.52 36.57 0.09 2.39 4.42 0.57 0.72 2.63 scd0 0.00 0.00 0.00 0.00 0.00 0.00 6.00 0.00 0.28 0.28 0.00 0.25 0.00登录后复制
sar
03:14:00 PM CPU %user %nice %system %iowait %steal %idle 03:14:02 PM all 0.25 0.00 0.38 0.00 0.00 99.37 03:14:04 PM all 1.25 0.13 0.63 0.00 0.00 97.99 03:14:06 PM all 0.25 0.13 0.50 0.00 0.00 99.12 03:14:08 PM all 0.50 0.00 0.50 0.63 0.00 98.37登录后复制
pidstat
03:14:00 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command 03:14:02 PM 5700 9089 0.00 6.00 0.00 uxxx 03:14:02 PM 5700 9140 0.00 6.00 0.00 uxxx 03:14:02 PM 5700 9292 0.00 10.00 0.00 uxxx 03:14:02 PM 0 18084 0.00 2.00 0.00 bash登录后复制
kill 掉收集信息的命令
ps -ef | egrep 'iostat|sar|pidstat|while' | grep -v grep | awk '{print $2}' | xargs -l kill登录后复制
但ps -ef | egrep 命令没有获取到while循环的pid,不kill掉该while循环,就会一直对/tmp/iostat_2019-03-13写数据-_-
通过lsof 没有定位到打开文件的进程
lsof /tmp/iostat_2019-03-13 [root@ip-10-186-60-117 ~]# [root@ip-10-186-60-117 ~]#登录后复制
通过lsof 可以定位到打开mysql-error.log的进程
lsof /opt/mysql/data/5690/mysql-error.log COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 12858 actiontech-universe 1w REG 253,1 6345 20083533 /opt/mysql/data/5690/mysql-error.log mysqld 12858 actiontech-universe 2w REG 253,1 6345 20083533 /opt/mysql/data/5690/mysql-error.log登录后复制
可见,某进程只有一只持有某文件的inode,才可以通过lsof查看文件在被那些进程使用
获取写文件的进程号
安装sysemtap
“
yum -y install systemtap
”
“
SystemTap 是对 Linux 内核监控和跟踪的工具
利用systemtap中的inodewatch.stp工具来查找写文件的进程号”
得到文件的inode
stat -c '%i' /tmp/iostat_2019-03-13 4210339登录后复制
获取文件所在设备的major,minor
ls -al /dev/vda1 brw-rw---- 1 root disk 253, 1 Jan 30 13:57 /dev/vda1登录后复制
得到写文件的pid
stap /usr/share/systemtap/examples/io/inodewatch.stp 253 1 4210339 Checking "/lib/modules/3.10.0-862.14.4.el7.x86_64/build/.config" failed with error: No such file or directory Incorrect version or missing kernel-devel package, use: yum install kernel-devel-3.10.0-862.14.4.el7.x86_64登录后复制
根据系统内核版本在kernel-devel rpm build for : Scientific Linux 7网站上下载相应的kernal-devel包
wget ftp://ftp.pbone.net/mirror/ftp.scientificlinux.org/linux/scientific/7.2/x86_64/updates/security/kernel-devel-3.10.0-862.14.4.el7.x86_64.rpm rpm -ivh kernel-devel-3.10.0-862.14.4.el7.x86_64.rpm登录后复制
再次执行stap
“
stap /usr/share/systemtap/examples/io/inodewatch.stp 253 1 4210339
……
Missing separate debuginfos, use: debuginfo-install kernel-3.10.0-862.14.4.el7.x86_64
Pass 2: analysis failed. [man error::pass2] Number of similar error messages suppressed: 2.”
安装debuginfo kernal
debuginfo-install kernel-3.10.0-862.14.4.el7.x86_64 Verifying : kernel-debuginfo-common-x86_64-3.10.0-862.14.4.el7.x86_64 1/3 Verifying : yum-plugin-auto-update-debug-info-1.1.31-50.el7.noarch 2/3 Verifying : kernel-debuginfo-3.10.0-862.14.4.el7.x86_64 3/3 Installed: kernel-debuginfo.x86_64 0:3.10.0-862.14.4.el7 yum-plugin-auto-update-debug-info.noarch 0:1.1.31-50.el7 Dependency Installed: kernel-debuginfo-common-x86_64.x86_64 0:3.10.0-862.14.4.el7登录后复制
再次执行stap
stap /usr/share/systemtap/examples/io/inodewatch.stp 253 1 4210339 ERROR: module version mismatch (#1 SMP Tue Sep 25 14:32:52 CDT 2018 vs #1 SMP Wed Sep 26 15:12:11 UTC 2018), release 3.10.0-862.14.4.el7.x86_64 WARNING: /usr/bin/staprun exited with status: 1 添加 -v查看详细报错 stap -v /usr/share/systemtap/examples/io/inodewatch.stp 253 1 4210339 Pass 1: parsed user script and 471 library scripts using 240276virt/41896res/3368shr/38600data kb, in 300usr/20sys/320real ms. Pass 2: analyzed script: 2 probes, 12 functions, 8 embeds, 0 globals using 399436virt/196284res/4744shr/197760data kb, in 1540usr/560sys/2106real ms. Pass 3: using cached /root/.systemtap/cache/f5/stap_f5c0cd780e8a2cac973c9e3ee69fba0c_7030.c Pass 4: using cached /root/.systemtap/cache/f5/stap_f5c0cd780e8a2cac973c9e3ee69fba0c_7030.ko Pass 5: starting run. ERROR: module version mismatch (#1 SMP Tue Sep 25 14:32:52 CDT 2018 vs #1 SMP Wed Sep 26 15:12:11 UTC 2018), release 3.10.0-862.14.4.el7.x86_64 WARNING: /usr/bin/staprun exited with status: 1 Pass 5: run completed in 0usr/10sys/38real ms. Pass 5: run failed. [man error::pass5]登录后复制
修改
vim /usr/src/kernels/3.10.0-862.14.4.el7.x86_64/include/generated/compile.h #define UTS_VERSION "#1 SMP Tue Sep 25 14:32:52 CDT 2018" 改为 #define UTS_VERSION "#1 SMP Wed Sep 26 15:12:11 UTC 2018" rm -rf /root/.systemtap/cache/f5/stap_f5c0cd780e8a2cac973c9e3ee69fba0c_7030*登录后复制
再次执行
“
stap /usr/share/systemtap/examples/io/inodewatch.stp 253 1 4210339
”
iostat(4671) vfs_write 0xfd00001/4210339 iostat(4671) vfs_write 0xfd00001/4210339 iostat(4671) vfs_write 0xfd00001/4210339 iostat(4671) vfs_write 0xfd00001/4210339 iostat(4671) vfs_write 0xfd00001/4210339 iostat(4671) vfs_write 0xfd00001/4210339 iostat(4671) vfs_write 0xfd00001/4210339 iostat(4671) vfs_write 0xfd00001/4210339 iostat(4671) vfs_write 0xfd00001/4210339 iostat(4671) vfs_write 0xfd00001/4210339 iostat(4677) vfs_write 0xfd00001/4210339 iostat(4677) vfs_write 0xfd00001/4210339 iostat(4677) vfs_write 0xfd00001/4210339 iostat(4677) vfs_write 0xfd00001/4210339 iostat(4677) vfs_write 0xfd00001/4210339 iostat(4677) vfs_write 0xfd00001/4210339 iostat(4677) vfs_write 0xfd00001/4210339 iostat(4677) vfs_write 0xfd00001/4210339 iostat(4677) vfs_write 0xfd00001/4210339 iostat(4677) vfs_write 0xfd00001/4210339 iostat(4683) vfs_write 0xfd00001/4210339 ............登录后复制
可见已经得到了写/tmp/iostat_date +%F 文件的进程号,但进程号一直在打印出来,因为后台进程iostat -dx -m 的在while循环中的,每隔sleep 2s 后就会执行一次iostat 产生新的pid。
那要怎样才能让iostat -dx -m 停止写/tmp/iostat_date +%F 文件了?除了重启大法好 _
rm -rf 也不能终止后台的while iostat进程写文件,删除了文件后,while循环又会生成新的文件
rm -rf /tmp/iostat_2019-03-1* stat /tmp/iostat_2019-03-1* File: ‘/tmp/iostat_2019-03-13’ Size: 146700 Blocks: 512 IO Block: 4096 regular file Device: fd01h/64769d Inode: 4210339 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2019-03-14 16:07:26.211888899 +0800 Modify: 2019-03-14 16:18:17.854019793 +0800 Change: 2019-03-14 16:18:17.854019793 +0800登录后复制
正确做法
cat>/tmp/iostat.shwhile [ 1 ];do echo -n `date +%T` >>/tmp/iostat_`date +%F` 2>& 1 && iostat -dx -m 1 1 >>/tmp/iostat_`date +%F` 2>& 1; sleep 2; done & EOF at now + 1 minute today bash /tmp/iostat.sh #这样就能方便的获取到进程号pid了 ps -ef | grep iostat root 8593 1 0 16:16 pts/2 00:00:00 bash /tmp/iostat.sh登录后复制
以上就是小干货:Linux 如何查看文件是被那个进程占用写数据?的详细内容,更多请关注慧达安全导航其它相关文章!
免责 声明
1、本网站名称:慧达安全导航
2、本站永久网址:https//www.huida178.com/
3、本站所有资源来源于网友投稿和高价购买,所有资源仅对编程人员及源代码爱好者开放下载做参考和研究及学习,本站不提供任何技术服务!
4、本站所有资源的属示图片和信息不代表本站的立场!本站只是储蓄平台及搬运
5、下载者禁止在服务器和虚拟机下进行搭建运营,本站所有资源不支持联网运行!只允许调试,参考和研究!!!!
6、未经原版权作者许可禁止用于任何商业环境,任何人不得擅作它用,下载者不得用于违反国家法律,否则发生的一切法律后果自行承担!
7、为尊重作者版权,请在下载24小时内删除!请购买原版授权作品,支持你喜欢的作者,谢谢!
8.若资源侵犯了您的合法权益,请持 您的版权证书和相关原作品信息来信通知我们!QQ:1247526623我们会及时删除,给您带来的不便,我们深表歉意!
9、如下载链接失效、广告或者压缩包问题请联系站长处理
10、如果你也有好源码或者教程,可以发布到网站,分享有金币奖励和额外收入!
11、本站资源售价只是赞助,收取费用仅维持本站的日常运营所需
12、因源码具有可复制性,一经赞助,不得以任何形式退款。
13、本文内容由网友自发贡献和站长收集,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系1247526623@qq.com
转载请注明出处: 慧达安全导航 » 小干货:Linux 如何查看文件是被那个进程占用写数据?
发表评论 取消回复