文件被那個進程使用,寫數據不是用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循環又會生成新的文件
正確做法