代码之家  ›  专栏  ›  技术社区  ›  Ross Dargan

保持perl脚本运行

  •  4
  • Ross Dargan  · 技术社区  · 9 年前

    我有一个使用AnyEvent::MQTT订阅消息队列的perl脚本。

    目前,我只想在收到消息时打印出来。我对perl完全陌生,所以我使用的是它附带的演示代码,其中包括一个在STDIN上以消息形式发布任何内容的代码——这很好,我可以看到收到的所有消息。

    该代码如下所示

    #!/usr/bin/perl
    use strict;
    use warnings;
    
    use AnyEvent::MQTT;
    my $mqtt = AnyEvent::MQTT->new;
    my $cv = $mqtt->subscribe(topic => '/AlarmMode',
                               callback => sub {
                                   my ($topic, $message) = @_;
                                           print $topic, ' ', $message, "\n"
                                       });
    
    my $qos = $cv->recv; # subscribed, negotiated QoS == $qos
    
    
    
      # publish line-by-line from file handle
          $cv =  $mqtt->publish(handle => \*STDIN,
                                topic => '/topic');
    

    我的问题是,如果我删除评论后的所有内容 publish line-by-line from file handle 然后我的应用程序一运行就退出。

    我尝试过包含一个while循环,该循环可以休眠5秒,但这不起作用(应用程序看起来就像挂起了一样)。

    我知道我需要做 某物 告诉应用程序保持活力和冷静,但我不知道这个命令是什么:-)

    1 回复  |  直到 9 年前
        1
  •  6
  •   ikegami Gilles Quénot    9 年前

    如果你用不知道AE的东西(例如。 sleep ),则不会处理AE事件。

    要在允许处理AE事件的同时进行睡眠,通常使用

    my $done_cv = AE::cv;
    $done_cv->recv;
    

    使用 $done_cv->send; 结束睡眠。例如,如果你想睡5秒钟,你可以使用

    my $sleep_cv = AE::cv;
    my $w = AE::timer(5, 0, $sleep_cv);  # Short for AE::timer(5, 0, sub { $sleep_cv->send });
    $sleep_cv->recv;