求教:线程问题

发布于 2022-10-15 10:05:58 字数 3890 浏览 46 评论 0

最近学习线程,编写测试程序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.

复制代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

生来就爱笑 2022-10-22 10:05:59

本帖最后由 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.

醉生梦死 2022-10-22 10:05:59

Should fix the issues.
albertd 发表于 2011-04-15 02:29

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

若能看破又如何 2022-10-22 10:05:59

本帖最后由 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

夏日浅笑〃 2022-10-22 10:05:59

对了
最好用个
Thread::Semaphore模块
控制一下线程,确保线程都完成了任务,主线程才退出
不然闪一下就没有了
模块里有具体例子

话少心凉 2022-10-22 10:05:59

我现在也在学线程啊。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文