前言
自己用树莓派整了个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管理界面时,也会莫名其妙唤醒硬盘,同时不会被上述代码记录。