免费注册 查看新帖 |

Chinaunix

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

[其他] 在脚本中执行后台命令时,需要执行wait命令,否则会内存泄露?(确认需要wait) [复制链接]

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-07-17 19:51 |只看该作者 |倒序浏览
本帖最后由 humjb_1983 于 2014-07-18 15:47 编辑

又来请教各位大师
在bash脚本中执行后台命令(加&)时,需要执行wait命令回收后台子进程的资源,否则会内存泄露?是这样的么?
不知这种情况下wait是否是标准用法?是否一定需要?
谢谢!
---------
问题解决,在这里贴一下,请大家以后注意使用wait吧,共勉。。。。
这个问题经过深入分析,已有基本结论:
在脚本中,调用后台执行的命令,确实应该wait,不wait的话,确有有内存泄露的情况,不信可以自己写个死循环调用后台命令的脚本,很容易复现的。
可以google搜一下脚本多任务,可以看到别人写的类似的脚本中,有很多都是用了wait的。

通过内存泄露检测,和bash相关代码和原理分析,问题产生的原因简单如下:
1、实际的内存泄露并不是被调用的后台进程自身产生的,泄露之处在于bash,bash调用后台命令,后台命令执行结束后,自身占用的资源(包括内存)应该是成功回收的(bash中应该考虑了SIGCHLD信号的处理),但问题关键在于:bash自己会为每一个后台子进程创建一个数据结构,用于保存后台进程的返回值,否则bash中就无法了解后台子进程的退出状态了,这在一些情况下,确实是需要了解的。所以,泄露的内存就在这个数据结构上,如果不用wait,那么每个后台子进程对应的数据结构就无法回收。
2、理论上,泄露的数据结构应该很小,不会产生大的影响,但是另一个关键在于glibc的堆实现,如果死循环中不断的创建后台子进程,那就不断的会有相应的数据结构分配,而其占用的内存很可能顶在了堆顶,我们知道,如果堆顶的内存不能回收,那么堆顶之下的内存也是不能回收的,所以由于该数据结构的泄露,可能导致更大的内存泄露。经过分析故障当时bash进程的堆分布情况,确实可以确认这一点。

综上,这个问题由于bash和glibc和脚本用法共同导致。
所以,各位,如果后面要在bash中调用后台命令,建议都wait一下吧。。。。

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
2 [报告]
发表于 2014-07-17 19:54 |只看该作者
求出处

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
3 [报告]
发表于 2014-07-17 19:59 |只看该作者
Shell_HAT 发表于 2014-07-17 19:54
求出处

呵呵,最近遇到一个奇特的问题,在脚本中反复调用后台命令(后台命令执行后会退出),发现一段时间后,内存占用明显增加,有内存泄露的痕迹。
经过前期使用内存泄露检测工具的分析,发现确有这样的迹象,搜了一下,好像有后台命令需要使用wait命令回收的说法,特来求证。。。

谢谢!

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
4 [报告]
发表于 2014-07-17 20:15 |只看该作者
man wait,跟memor leak无关啊

论坛徽章:
1
双鱼座
日期:2014-08-25 19:13:11
5 [报告]
发表于 2014-07-17 23:00 |只看该作者
楼主是想表达僵尸进程么

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
6 [报告]
发表于 2014-07-18 08:35 |只看该作者
回复 4# expert1
呵呵,手册中是没有提到~,但实际上好像确实有问题,写个简单的测试用例,多跑会能复现。。。。

   

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
7 [报告]
发表于 2014-07-18 08:36 |只看该作者
fxpbupt 发表于 2014-07-17 23:00
楼主是想表达僵尸进程么

不是僵尸,这种情况下bash应该是处理了SIGCHLD信号的,不用wait也不会有僵尸。
说的是内存泄露的问题。

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
8 [报告]
发表于 2014-07-18 10:24 |只看该作者
没听过这样的说法,会不会你运行的脚本调用的一些程序存在内存泄露?
或者说,你用同样的脚本,加了 wait 就不会内存泄露了?

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
9 [报告]
发表于 2014-07-18 10:34 |只看该作者
seesea2517 发表于 2014-07-18 10:24
没听过这样的说法,会不会你运行的脚本调用的一些程序存在内存泄露?
或者说,你用同样的脚本,加了 wait  ...

对的加了wait,就没有内存泄露了。。。

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
10 [报告]
发表于 2014-07-18 11:04 |只看该作者
回复 9# humjb_1983


    这真是奇怪的现象。关注楼主进展……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP