hey joe. Thanks a lot. I was worrying about today's advent. :) Thanks.
On 2009-12-15 11:30, joe jiang wrote: > =for advent_year 2009 > > =for advent_day 15 > > =for advent_title POE > > =for advent_author Joe Jiang > > 做维护的人每天都需要和 ssh 打交道,可是往往会面对 ssh 断线的苦恼。在发 > 现了 A<http://www.harding.motd.ca/autossh|autossh > <http://www.harding.motd.ca/autossh%7Cautossh>> 这个很酷的 ssh 断线自 > 动重连工具之后,一个问题随之浮现出来,那就是如何才能找到它需要的 echo > 服务(如果不希望在所有机器上启动 inetd 的 echo 服务)。想找个 > A<http://search.cpan.org/dist/AnyEvent|AnyEvent > <http://search.cpan.org/dist/AnyEvent%7CAnyEvent>> 框架的实现未果,不 > 由得想起多年前用过的一个模块 A<http://search.cpan.org/dist/POE|POE > <http://search.cpan.org/dist/POE%7CPOE>>。 > > POE 虽然名叫 Perl Object Environment,但是和 OO 并无显著的关系,而是一 > 个面向 Perl Event Driven Programming 的框架。在众多的事件驱动框架中, > 这是一个比较成熟的选择。 > > 用 POE 实现 echo 服务的单行 perl 程序如下: > > =begin pre > > % echo install POE can be done with cpan or your favorate module > package manager > > % perl -MPOE=Component::Server::TCP -e > 'POE::Component::Server::TCP->new(Port=>3240, ClientInput=>sub > {$_[HEAP]{client}->put($_[ARG0])});POE::Kernel->run' > > =end pre > > 然后你就可以在另外的 shell 中尝试 telnet localhost 3240,验证此 echo > 脚本的工作(多个 client 应该也没有问题)。POE::Component::Server::TCP > 这个模块确实是为此任务而设计的最佳解决方案,它通过 use POE > qw(Component::Server::TCP) 来引入主程序(也就是这个单行脚本),因此成 > 为命令行的第一个参数 -MPOE=...。 > > 现在问题是如何部署这个脚本到所有需要监管的 Server,当然逐个机器安装 > POE 模块不会是最佳的解决方案,否则还不如逐个打开 echo 服务。所以这时候 > 就可以考虑使用 perl packer 工具 PAR::Packer,具体说就是 pp 这个命令行 > 工具。 > > 在经过一番尝试以后,这个 echo_server 在我的机器上生成了: > > =begin pre > > % echo install PAR::Packer can be done with cpan or your favorate > module package manager > > % pp -M POE -e 'require POE::Filter; require > POE::Component::Server::TCP; > POE::Component::Server::TCP->new(Port=>3240, ClientInput=>sub > {$_[HEAP]{client}->put($_[ARG0])});POE::Kernel->run;' -o /tmp/echod > > % /tmp/echod & sleep 1; lsof -i :3240 > COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME > echod 14299 joe 6u IPv4 137293 TCP *:3240 (LISTEN) > > =end pre > > 在 /tmp 目录下生成了一个 echod 服务器程序,在后台启动它之后可以用 > telnet 再次验证。这时程序已经成为自包含的,不再依赖于生养它的 Perl 母 > 环境。可以用 unzip 来了解它的结构。 > > 另外值得一提的是,由于 POE 模块自己用了一些算法来决定它载入的子模块, > 所以 pp 工具无法完全猜对,所以在命令行中出现了 require 语句,用来告知 > 需要补充加载(到可执行 zip 中)的两个模块。 > > =begin pre > > $ unzip -l /tmp/echod | head > Archive: /tmp/echod > Length Date Time Name > -------- ---- ---- ---- > 0 12-15-09 11:10 lib/ > 0 12-15-09 11:10 script/ > 27145 12-15-09 11:10 MANIFEST > 217 12-15-09 11:10 META.yml > 5438 12-15-09 11:10 lib/AutoLoader.pm > 7922 12-15-09 11:10 lib/B.pm > 128602 12-15-09 11:10 lib/B/Deparse.pm > ... > > =end pre > > 这样的程序只要 copy 到所有需要运行的机器并且启动就可以,完成这个工作的 > 工具是第五天介绍的 SSH::Batch。 > > -- > > 您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组” > 论坛。 > 要向此网上论坛发帖,请发送电子邮件至 [email protected]。 > 要取消订阅此网上论坛,请发送电子邮件至 > [email protected]。 > 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN > 访问此网上论坛。 -- Fayland Lam // http://www.fayland.org/ -- 您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。 要向此网上论坛发帖,请发送电子邮件至 [email protected]。 要取消订阅此网上论坛,请发送电子邮件至 [email protected]。 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
