ITPub博客

首页 > 自动化运维 > 应用服务器 > [20230201]磁盘空间爆满.txt

[20230201]磁盘空间爆满.txt

原创 应用服务器 作者:lfree 时间:2023-02-09 21:29:03 0 删除 编辑

[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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969669