Chinaunix首页 | 论坛 | 博客
  • 博客访问: 162734
  • 博文数量: 118
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 12
  • 用 户 组: 普通用户
  • 注册时间: 2013-06-21 16:38
文章分类

全部博文(118)

文章存档

2013年(118)

我的朋友

分类: LINUX

2013-10-21 15:01:33

原文地址:awk 打开文件过多 作者:Super_Green


点击(此处)折叠或打开

  1. path = "'$POP_ALL_INFILE_PATH'/"pop_name;
  2.                 
  3.                 CMD="[ ! -d "path" ] && mkdir -p "path;
  4.                 system(CMD);
  5.                 close(CMD);
  6.                 if ($3 >= pop_alarm_bw * '$GLBDOMAIN2FARM_FORECAST_MIN_PERCENT') {
  7.                     print "'$file_data_time'",$3 / 1000.0 / 1000.0 >> "'$POP_ALL_INFILE_PATH'/"pop_name"/"$1"_"$2;
  8.                     print pop_name,$1"_"$2>> "'$FORECASE_INFILE'/'$TYPE'/glbdomain_update_list";            
  9.                     close("'$POP_ALL_INFILE_PATH'/"pop_name"/"$1"_"$2);
  10.                 }

刚开始是无两行close的,但此时程序运行会发现到后面一些目录就无法创建,此时print一些数据到这些目录中的文件就会失败,程序会直接退出。用value = system(CMD);获取了下返回值,发现当程序跑到一定程度的时候返回值为127,根据网上查找有可能是打开的文件过多,第一反应是CMD命令执行后没有关闭,此时lsof发现并不是这个原因,而是
awk用print把数据打入到一个文件的时候,会打开此文件,且不会立马关闭,而会在整个awk执行结束后在关闭此文件。这样的话就会导致一个进程打开文件个数过多从而无法在穿件目录,也就无法把数据写到要创建目录下面的文件。 

总结:对于awk调用命令有管道的产生或者有打开文件的操作,要在执行结束后用close进行相应的关闭。
阅读(653) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~