首页 > 自动化运维 > 应用服务器 > [20230201]磁盘空间爆满.txt
[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博客 ” ,链接:https://blog.itpub.net/267265/viewspace-2934652/ ,如需转载,请注明出处,否则将追究法律责任。