Linux记录读写硬盘的程序脚本

前言

自己用树莓派整了个NAS玩玩,但是经常听到硬盘在本应无访问的时候转来转去,遂想查明究竟为何转。
曾考虑使用fuser -mv /dev/sda这样的命令,但是奈何输出内容我不知如何输出到文件,用>或tee都无法重定向到文件里。

思路

使用lsof /dev/sda得到当前正在读写硬盘的进程,将内容输出至文件,并记录时间戳

实现

方法并不是最优解,也请大佬不吝赐教
使用方法 python3 ./watch.py /dev/sda a 1
参数1: 监控的硬盘
参数2: 写入文件的文件名(a.txt)
参数3: 每隔1s执行一次lsof

import os
from pathlib import Path
import time
import subprocess
import sys

def run():
    p = subprocess.Popen(‘sudo lsof ‘+sys.argv[1],shell=True,stdout=subprocess.PIPE)  
    out,err = p.communicate()
    result = []
    for line in out.splitlines(): 
            line = line.decode(‘utf-8‘).split()
            result.append((line[0],line[2],str(line[8:]).replace(‘\‘‘,‘‘)[1:-1]))
    return result

if __name__ == ‘__main__‘:
    if os.path.exists(Path(‘./‘+sys.argv[2]+‘.txt‘)):
        os.remove(‘./‘+sys.argv[2]+‘.txt‘)
    line_old=[]
    while 1:
        result = run()
        for line in result:
            now =‘\t\t‘+ line[0]+‘\t\t‘+line[1]+‘\t\t‘+str(line[2])+‘\n‘
            if not now in line_old[:]:
                with open(‘./‘+sys.argv[2]+‘.txt‘,‘a‘) as f:
                    f.write(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())+‘‘)
                    f.write(now)
                f.close()
            line_old.append(now)
        time.sleep(float(sys.argv[3]))

总结

最后这份代码也没有查明到底为何导致我的硬盘转,后猜测为OpenMediaValut的S.M.A.R.T开启所导致,虽说那是并无检查任务,但估计是Bug之类的问题吧。另外,在使用OpenmeidaVault管理界面时,也会莫名其妙唤醒硬盘,同时不会被上述代码记录。

Linux记录读写硬盘的程序脚本

上一篇:在eclipse中设置文件夹和文件显示最后提交人和提交时间


下一篇:Windows常用快捷键