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

ChinaUnix.net

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

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

本版积分规则

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP