你檢查的輸出有多大?最多一百行我只是保存整個原始文件,然後使用cmp
來查看它是否發生了變化。假設散列計算必須讀取每個字節,那麼從校驗和類型計算中獲得優勢的唯一方法是,如果執行此操作的成本低於讀取兩個具有該大小的文件的成本。
而且cmp
根據您的問題的更新不會給你任何假陽性或假陰性:-)
pax> echo hello >qq1.txt
pax> echo goodbye >qq2.txt
pax> cp qq1.txt qq3.txt
pax> cmp qq1.txt qq2.txt >/dev/null
pax> echo $?
1
pax> cmp qq1.txt qq3.txt >/dev/null
pax> echo $?
0
:
我被要求監視DNS記錄一組1000個左右的域名,並且如果有任何變化,立即調用某些其他腳本。我打算做一個挖掘xyz + short語句並散列它的輸出並存儲它,然後根據以前存儲的值進行檢查。任何改變都會觸發另一個腳本,否則就會繼續。現在,我們正在計劃使用cron來處理這1000個數據集,但是可以完全不同地認爲「嚴重」的使用 - 大約20000左右。
我不確定你需要擔心太多的文件I/O。以下腳本首先用文件I/O執行了5000次5000次,然後輸出到/dev/null
(通過更改註釋)。
#!/bin/bash
rm -rf qqtemp
mkdir qqtemp
((i = 0))
while [[ $i -ne 5000 ]] ; do
#dig microsoft.com +short >qqtemp/microsoft.com.$i
dig microsoft.com +short >/dev/null
((i = i + 1))
done
在5次運行所經過的時間分別是:
File I/O | /dev/null
----------+-----------
3:09 | 1:52
2:54 | 2:33
2:43 | 3:04
2:49 | 2:38
2:33 | 3:08
去除異常值和平均後,結果是2:49用於文件I/O和2:45的/dev/null
。對於5000次迭代,時間差爲4秒,每個項僅有012秒的時間差。
但是,由於對5000進行迭代最多需要三分鐘,這就是檢測問題需要多長時間(平均一分半鐘)。如果這是不可接受的,你需要從bash
移到另一個工具。
假設一個只需要大約0.012秒,理論上你應該在60秒內完成5000次,假設你的檢查工具完全沒有時間。在Perl中做這樣的事情可能會更好,並使用關聯數組來存儲的輸出。
Perl的半編譯特性意味着它的運行速度可能會比bash
腳本快得多,而Perl的花哨的東西將使工作變得更加簡單。但是,由於運行命令需要多長時間,因此您不可能將60秒的時間降低得多。
在典型的桌面系統上,md5sum每秒可以處理數百兆字節的數據(請查看'pv/dev/zero | md5sum')。無論使用什麼哈希算法,I/O和進程產卵開銷都可能會佔上風。 – rkhayrov 2010-07-24 12:08:45
你爲什麼要把它寫成shell腳本:| - python和其他腳本語言在它們的std庫中有散列函數。每個散列的進程開始會產生很多開銷。 – sleeplessnerd 2012-05-12 23:10:00