[20230201]磁碟空間爆滿.txt

lfree發表於2023-02-09

[20230201]磁碟空間爆滿.txt

--//今天干了一件"壞"事,導致磁碟空間爆滿.
--//我使用grep -r遞規檢索某個字串.
d:\xxxx> grep -r orcldg *
--//看了一下感覺需要儲存到某個檔案慢慢檢視,執行如下:
d:\xxxx> grep -r orcldg * > xxxx.txt

--//然後內急去了一趟廁所,回來時導致磁碟空間爆滿.因為生成的檔案也在掃描目錄之內,而它的內容還在不斷增加,這樣導致死迴圈.
--//應該改寫如下,在不同目錄生成xxxx.txt檔案:
d:\xxxx> grep -r orcldg * > d:\xxxx.txt

--//實際上這樣的問題不會出現在linux系統裡面.因為在linux下bash shell解析*時並不包括>建立的檔案xxxx.txt
--//即使解析時存在xxxx.txt檔案也沒有問題. > 覆蓋其中內容.
$ grep -r orcldg * > xxxx.txt

--//但是如果這樣執行,可能遇到相似的問題.
$ touch xxxx.txt
$ grep -r orcldg * >> xxxx.txt
$ wc xxxx.txt
16   68 1374 xxxx.txt
--//第1次ok!
$ grep -r  orcldg * >> xxxx.txt
--//第2次OK!
--//第3次執行,問題再現!!為什麼我不知道?
$ grep -r  orcldg * >> xxxx.txt
--//按ctrl+c
$ wc xxxx.txt
    247557    1052116 1963274394 xxxx.txt

--//在linux下bash shell解析*時包括xxxx.txt,一樣會出現磁碟爆滿的情況.
--//我在測試環境遇到奇怪的現象,理論講第2次執行就會出現問題,但是我的測試第3次才會出現.
--//重複演示:

$ >| xxxx.txt
$ grep -r  orcldg * >> xxxx.txt
$ wc xxxx.txt
  16   68 1374 xxxx.txt
$ grep -r  orcldg * >> xxxx.txt
$ wc xxxx.txt
  48  204 4266 xxxx.txt
--//檔案大於4K.48行可以這樣理解前面3個檔案輸出16行,xxxx.txt輸出16行,這樣追加32行,正好48行.
--//為什麼這個時候不出現死迴圈不理解.

$ echo xx*
xx1.txt xx2.txt xx3.txt xxxx.txt
$ grep -r  orcldg * >> xxxx.txt
^C
$ echo xx*
xx1.txt xx2.txt xx3.txt xxxx.txt
$ wc xxxx.txt
    86058    365744 527937706 xxxx.txt

--//不知道是否與掃描順序存在關係與否或者與檔案生成大小有關(大於4K).
--//繼續測試是否與檔案大小相關:

$ >| xxxx.txt
$ grep -r  orcldg * >> xxxx.txt
$ wc xxxx.txt
  15   59 1262 xxxx.txt
$ grep -r  orcldg * >> xxxx.txt
$ wc xxxx.txt
  45  177 3921 xxxx.txt
$ echo xx*
xx1.txt xx2.txt xx3.txt xxxx.txt
$ grep -r  orcldg * >> xxxx.txt
^C
$ wc xxxx.txt
   106270    417990 855715665 xxxx.txt
--//855715665/1024/1024 = 816M,5秒不到生成815G.

--//後記:為什麼第3次出現死迴圈,因為第2次grep -r  orcldg * 時,追加xxxx.txt 1262位元組.這樣xxxx.txt共1262*2 = 2524.
--//在掃描xxxx.txt時,僅僅2524位元組先判斷到檔案結束.grep先關閉xxxx.txt的檔案控制程式碼關閉,避免死迴圈的出現.
--//在家裡windows系統上測試:

mkdir testA
cd testA
echo orcldg > xx1.txt
touch  xxxx.txt

testA> grep -r  orcldg * >> xxxx.txt
testA> wc xxxx.txt
      1       1      15 xxxx.txt

testA> grep -r  orcldg * >> xxxx.txt

testA> wc xxxx.txt
      3       3      54 xxxx.txt

testA> grep -r  orcldg * >> xxxx.txt

testA> wc xxxx.txt
      7       7     150 xxxx.txt

--//你可以發現就是看看那個先執行完成,如果grep 掃描xxxx.txt先完成,關閉控制程式碼.就不會出現死迴圈.
--//但是如果xxxx.txt檔案大於一定程度,一定會出現死迴圈.

testA> grep -r  orcldg * >> xxxx.txt

testA> wc xxxx.txt
     15      15     378 xxxx.txt

testA> grep -r  orcldg * >> xxxx.txt

testA> wc xxxx.txt
     31      31     906 xxxx.txt

testA> grep -r  orcldg * >> xxxx.txt

testA> wc xxxx.txt
     63      63    2106 xxxx.txt

testA> grep -r  orcldg * >> xxxx.txt

testA> wc xxxx.txt
    127     127    4794 xxxx.txt

testA> grep -r  orcldg * >> xxxx.txt
^C

testA> wc xxxx.txt
  61054   61054 133067193 xxxx.txt


--//如果在cygwin下測試:

mkdir testA
cd testA
echo orcldg > xx1.txt
touch  xxxx.txt

$ grep -r  orcldg * >> xxxx.txt
grep: input file 'xxxx.txt' is also the output

$ wc xxxx.txt
 1  1 15 xxxx.txt

$ grep -r  orcldg * >> xxxx.txt
grep: input file 'xxxx.txt' is also the output

$ wc xxxx.txt
 2  2 30 xxxx.txt

--//會報grep: input file 'xxxx.txt' is also the output,避免出現死迴圈問題.
--//不知道linux新的bash版本修復這個問題了沒有.


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2934652/,如需轉載,請註明出處,否則將追究法律責任。

相關文章