1. 程式人生 > 其它 >Linux記錄讀寫硬碟的程式指令碼

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管理介面時,也會莫名其妙喚醒硬碟,同時不會被上述程式碼記錄。