免费注册 查看新帖 |

Chinaunix

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

求教:线程问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-14 16:06 |只看该作者 |倒序浏览
最近学习线程,编写测试程序manage.pl,利用线程访问srv.list中的服务器,取得uname -a 的值,但是提示
Thread 1 terminated abnormally: Not a CODE reference at manage.pl line 17.

另外如果列表中某台服务器不能访问,程序会中断
并提示
Permission denied at manage.pl line 35
Perl exited with active threads:
        0 running and unjoined
        6 finished and unjoined
        0 running and detached
  1. #!/usr/bin/perl
  2. use strict;
  3. use Net::SSH::Perl;
  4. use threads;
  5. use Thread::Queue;

  6. my $queue = new Thread::Queue;
  7. my $max = 10;

  8. open my $IN, '<', 'srv.list' or die "Don't open File!\n";
  9. while (<$IN>)
  10. {
  11.    $queue->enqueue($_);
  12. }
  13. close $IN;

  14. for ( my $n = 0; $n < $max; $n++)
  15. {
  16.     threads->create(\&exec_command());
  17. }

  18. foreach my $th (threads->list(threads::all))
  19. {
  20.         $th->detach();
  21. }

  22. sub exec_command()
  23. {
  24.    my $host = $queue->dequeue();
  25.    my $user = 'zoomi';
  26.    my $pass = 'zoomi-init';
  27.    my $cmd='uname -a';

  28.    my $ssh = Net::SSH::Perl->new($host);
  29.    $ssh->login($user, $pass);
  30.    my($stdout, $stderr, $exit) = $ssh->cmd($cmd);

  31.    if ($exit == 0) {
  32.       print "$host -> $stdout";
  33.    } else {
  34.       print "$host -> $stderr";
  35.    }
  36. }
复制代码
  1. 10.60.30.15
  2. -> Linux zoomi-30-15 2.6.31-14-generic #48-Ubuntu SMP Fri Oct 16 14:05:01 UTC 2009 x86_64 GNU/Linux
  3. Thread 1 terminated abnormally: Not a CODE reference at manage.pl line 17.
  4. 10.60.30.16
  5. -> Linux zoomi-30-16 2.6.31-23-server #74-Ubuntu SMP Mon Feb 28 22:32:34 UTC 2011 x86_64 GNU/Linux
  6. Thread 2 terminated abnormally: Not a CODE reference at manage.pl line 17.
  7. 10.60.30.17
  8. -> Linux zoomi-30-17 2.6.31-14-generic #48-Ubuntu SMP Fri Oct 16 14:05:01 UTC 2009 x86_64 GNU/Linux
  9. Thread 3 terminated abnormally: Not a CODE reference at manage.pl line 17.
  10. 10.60.30.18
  11. -> Linux zoomi-30-18 2.6.31-14-server #48-Ubuntu SMP Fri Oct 16 15:07:34 UTC 2009 x86_64 GNU/Linux
  12. Thread 4 terminated abnormally: Not a CODE reference at manage.pl line 17.
  13. 10.60.30.19
  14. -> Linux ubuntu 2.6.31-14-server #48-Ubuntu SMP Fri Oct 16 15:07:34 UTC 2009 x86_64 GNU/Linux
  15. Thread 5 terminated abnormally: Not a CODE reference at manage.pl line 17.
  16. 10.60.30.25
  17. -> Linux zoomi-30-25 2.6.31-14-server #48-Ubuntu SMP Fri Oct 16 15:07:34 UTC 2009 x86_64 GNU/Linux
  18. Thread 6 terminated abnormally: Not a CODE reference at manage.pl line 17.
  19. 10.60.30.27
  20. -> Linux server-A-test 2.6.31-14-server #48-Ubuntu SMP Fri Oct 16 15:07:34 UTC 2009 x86_64 GNU/Linux
  21. Thread 7 terminated abnormally: Not a CODE reference at manage.pl line 17.
  22. 10.60.30.28
  23. -> Linux zoomi-30-28 2.6.31-14-generic #48-Ubuntu SMP Fri Oct 16 14:05:01 UTC 2009 x86_64 GNU/Linux
  24. Thread 8 terminated abnormally: Not a CODE reference at manage.pl line 17.
  25. 10.60.30.29
  26. -> Linux server-B-test 2.6.31-14-server #48-Ubuntu SMP Fri Oct 16 15:07:34 UTC 2009 x86_64 GNU/Linux
  27. Thread 9 terminated abnormally: Not a CODE reference at manage.pl line 17.
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-04-15 02:29 |只看该作者
本帖最后由 albertd 于 2011-04-15 02:31 编辑
  1. sub exec_command()
  2. {
  3.    my $user = 'xxxxx';
  4.    my $pass = 'xxxxx';
  5.    my $cmd='uname -a';

  6.    while (my $host = $queue->dequeue())
  7.        {
  8.            eval {my $ssh = Net::SSH::Perl->new($host);
  9.                $ssh->login($user, $pass);
  10.                my($stdout, $stderr, $exit) = $ssh->cmd($cmd);

  11.                if ($exit == 0) {
  12.                print "$host -> $stdout";
  13.                } else {
  14.                print "$host -> $stderr";
  15.                }
  16.            };
  17.         warn $@ if $@;
  18.    }
  19. }
复制代码
Should fix the issues.

论坛徽章:
0
3 [报告]
发表于 2011-04-15 09:43 |只看该作者
Should fix the issues.
albertd 发表于 2011-04-15 02:29


那个报错产生的原因是什么?还有我的程序运行后,不能正常退出

论坛徽章:
0
4 [报告]
发表于 2011-04-16 22:07 |只看该作者
本帖最后由 ykredrum 于 2011-04-16 22:24 编辑

  1. for ( my $n = 0; $n < $max; $n++)

  2. {

  3.     threads->create(\&exec_command());

  4. }
复制代码
\&exec_command()
似乎多了对括号吧

应该是 \&exec_command

论坛徽章:
0
5 [报告]
发表于 2011-04-16 22:23 |只看该作者
对了
最好用个
Thread::Semaphore模块
控制一下线程,确保线程都完成了任务,主线程才退出
不然闪一下就没有了
模块里有具体例子

论坛徽章:
0
6 [报告]
发表于 2011-04-17 10:16 |只看该作者
我现在也在学线程啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP