免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3210 | 回复: 10
打印 上一主题 下一主题

请教如何正确的重复require一个PM [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-04 10:07 |只看该作者 |倒序浏览
20可用积分
本帖最后由 huhuegg 于 2013-03-04 12:11 编辑

一段时间重复加载一次自定义的PM,不过连续观察后发现脚本会有一些RSS内存增加,
请教我的require使用方法是否有问题~
  1. my $Monitor;
  2. my $defaultPM="......"; #一定可以加载成功的默认PM内容
  3. my $pm="......"; #隔一段时间会更新内容的PM内容

  4. sub loadPM {
  5.     my ($type)=@_;
  6.     my $sub="[loadPM]";
  7.     my $filename ="/tmp/monitor_linux.pm";
  8.     if (-e "$filename") {
  9.         unlink("$filename");
  10.     }
  11.     if (open(PM,">$filename")) {
  12.         if ($type) {
  13.             print PM $pm;
  14.         } else {
  15.             print PM $defaultPM;
  16.         }
  17.         close(PM);
  18.         eval {
  19.             if (exists $INC{$filename}) {
  20.                 $INC{$filename} = undef;
  21.                 delete $INC{$filename};
  22.             }
  23.             require "$filename";
  24.         };
  25.         if ($@) {
  26.             unlink("$filename");
  27.             wlog('err',"$sub load pm error!");
  28.         } else {
  29.             if ($Monitor) {
  30.                 undef $Monitor;
  31.             }
  32.             $Monitor=Monitor::Linux->new();
  33.             $MonitorVer=$Monitor->{Version};
  34.             if ($Monitor) {
  35.                 my $s= "$sub Load new PM ok, version:$MonitorVer";
  36.                 unlink("$filename");
  37.             } else {
  38.                 unlink("$filename");
  39.                 wlog('err',"$sub Monitor::Linux->new() ERROR,load default PM");
  40.                 &loadPM();
  41.             }
  42.         }
  43.         eval{unlink("$filename");};
  44.     } else {
  45.         die "create pm error!\n";
  46.     }
  47. }
复制代码

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
2 [报告]
发表于 2013-03-04 10:27 |只看该作者
你直接 eval  $pm 或 $defaultPM 字符串不就行了,何苦再建个临时文件再检测 $!。

论坛徽章:
0
3 [报告]
发表于 2013-03-04 10:37 |只看该作者
不好意思,脚本太长我只摘了一段,
脚本默认将$defaultPM的内容创建到一个临时文件,用于require(因为没有找到方法让require直接可以用字符串)
随着PM的更新将更新的PM内容保存在$pm中,再次创建临时文件使用require加载

这样的想法是否是错误的?

论坛徽章:
0
4 [报告]
发表于 2013-03-04 10:57 |只看该作者
功能上面测试下来貌似没有问题,为什么内存会持续升高呢?
是否是我重复requre的方法有问题?或者需要添加其它的清理方式?

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
5 [报告]
发表于 2013-03-04 11:10 |只看该作者
回复 4# huhuegg


    你可以针对这个函数写段代码测试下。另外不修改 %INC 重复执行一个脚本可以用 do 'linux.pm'

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
6 [报告]
发表于 2013-03-04 11:13 |只看该作者
还有那里连续两个 open 的写法很2,但是泄露不泄露我也不知道

论坛徽章:
0
7 [报告]
发表于 2013-03-04 12:09 |只看该作者
本帖最后由 huhuegg 于 2013-03-04 12:10 编辑

呀没注意,上面那个根本不需要...
让我偷偷的删了吧

论坛徽章:
0
8 [报告]
发表于 2013-03-04 12:20 |只看该作者
将数据和算法分离出来,用一个纯数据文件表示不断变化的数据,用检测文件大小的方式来判定是否需要加载这个数据。

你将一个变化的数据放到一个模块中,把检测数据变化变成重新加载模块,将问题复杂化,按照这个思路,小问题很快变成大问题,成为泥沼。

论坛徽章:
0
9 [报告]
发表于 2013-03-04 12:30 |只看该作者
本帖最后由 huhuegg 于 2013-03-04 12:37 编辑

这是个Agent,通过PM实现一些定制的功能
更新的不是数据,更新的是sub
远端通过socket将更新的PM推送过来,Agent重新加载这个PM

Agent大部分和业务相关的功能都通过PM更新来实现

这样实现方式是否不妥?

Perl有没有不需要创建文件,能够直接使用require/do或其它方式加载PM的?

论坛徽章:
0
10 [报告]
发表于 2013-03-11 16:29 |只看该作者
反复do也会增加内存,感觉还是没正确释放,求解~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP