忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 1260 | 回复: 3

多线程调用外部shell命令,进程挂住僵死问题 [复制链接]

论坛徽章:
0
发表于 2017-07-07 08:26 |显示全部楼层
perl新手求助~

创建了N个线程,每个线程执行同样的功能(函数),每个线程从队列中获取数据处理,代码大体框架如下:

        my $thread_num = int(sysconf(SC_NPROCESSORS_ONLN));
        for (0..$thread_num) {
                $data_queue->enqueue(undef);
                threads->create(sub {
                        while (my $pack = $data_queue->dequeue()) {
                                process($pack);

                        }
                });
        }
        foreach (threads->list()) { $_->join(); }


其中process函数需要执行外部shell命令,执行shell命令的函数如下:
sub my_system {
    my $cmd = shift;
    debug("my_system: $cmd");
    my $ret;
    my $pid;
    my @out = ();
    if (wantarray) {
        defined($pid=open(PIPE, "-|")) or die "Can not fork: $!\n";
    } else {
        defined($pid=fork) or die "Can not fork: $!\n";
    }

    unless ($pid) {  # Child
        open(STDERR, ">&STDOUT");
        exec ($cmd);
    } else {  # Parent
        if (wantarray) {
            while (my $line = <PIPE>) {
                print $line;
                push @out, $line;
            }
        }
        waitpid ($pid,0);
        $ret = $?;
        close(PIPE) if wantarray;

        return wantarray ? ($ret, @out): $ret;
    }
}


现在的问题是代码运行的时候,经常在my_system里面出现父进程挂住,使用ps可以看到有不少子进程是defunct进程,我的分析是父进程陷入while (my $line = <PIPE>)不能跳出循环。。。
尝试过以下方法:
1. 直接使用系统的system调用,也会出现挂住;
2. 直接使用readpipe,也会挂住;
3. 将线程数改小,挂住的几率会变小,但是时间长了依然会挂住;
4. 在父进程的while 循环里面,加入sleep,几率明显降低,但还是会有(跑了3个多小时出现);
个人觉得是stdout缓存区的问题。。。

求助各位帮忙看看,到底是哪边的问题,如何才能彻底解决?

论坛徽章:
0
发表于 2017-07-10 21:25 |显示全部楼层
Perl ithread各种坑,5.20开始的官方文档里都不建议使用。

不需要共享数据的话直接Parallel::ForkManager,需要共享数据的话试试forks模块。

论坛徽章:
0
发表于 2017-07-11 14:14 |显示全部楼层
回复 2# zhouzhen1

好的,谢谢大神,我用的方法试试,稍后反馈结果~

论坛徽章:
0
发表于 2017-07-12 17:18 |显示全部楼层
droidzhangy 发表于 2017-07-11 14:14
回复 2# zhouzhen1

好的,谢谢大神,我用的方法试试,稍后反馈结果~

由于有数据共享,采用了forks模块,目前稳定运行了4个小时未出问题,看来是perl threads的问题。再次感谢@zhouzhen1

您需要登录后才可以回帖 登录 | 注册

本版积分规则

10张SACC2017门票等你来拿~

在数字化转型时代,云已成为万物智能的数字化大脑。而随着大数据应用、人工智能、移动互联网等技术的飞速发展,“智慧 +” 的概念正在深入到各行各业,提升企业效率,释放商业潜能,创造全新机遇。作为国内顶级技术盛会之一,2017 中国系统架构师大会(SACC2017)将于 10 月 19-21 日在北京新云南皇冠假日酒店震撼来袭。今年,大会以 “云智未来” 为主题,云集国内外顶级专家,围绕云计算、人工智能、大数据、移动互联网、产业应用等热点领域展开技术探讨与交流。本届大会共设置 2 大主会场,18 个技术专场;邀请来自互联网、金融、制造业、电商等多个领域,100 余位技术专家及行业领袖来分享他们的经验;并将吸引 4000 + 人次的系统运维、架构师及 IT 决策人士参会,为他们提供最具价值的交流平台。
----------------------------------------
优惠时间:2017年10月19日前

活动链接>>
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP