繁体   English   中英

如何在Perl中创建TCP服务器守护进程?

[英]How can I create a TCP server daemon process in Perl?

我希望在Perl中创建一个TCP服务器守护进程。

哪个是最佳的框架/模块?

Perl附带有什么东西吗?

编辑:已经开始的事情| 停止| 重新启动选项会很棒。

编辑:它必须是多线程服务器。

好吧-最好说明一下该守护程序应该做什么。 由于有专门的框架/库来执行各种任务。

对于什么都不做的最简单的守护进程,它可以存在,您可以轻松地做到这一点:

#!/usr/bin/perl
use strict;
use warnings;
use Carp;
use POSIX qw( setsid );

daemonize();

do_your_daemon_stuff();

exit;

sub daemonize {
    chdir '/'                 or croak "Can't chdir to /: $!";
    open STDIN, '/dev/null'   or croak "Can't read /dev/null: $!";
    open STDOUT, '>/dev/null' or croak "Can't write to /dev/null: $!";
    defined(my $pid = fork)   or croak "Can't fork: $!";
    exit if $pid;
    setsid                    or croak "Can't start a new session: $!";
    open STDERR, '>&STDOUT'   or croak "Can't dup stdout: $!";
}

sub daemonize()是从perldoc perlipc提升的(稍作更改)。

仅此而已-代码现在可以正确守护了,并且可以执行您想要的任何操作。

我刚读了您的编辑,即要使用TCP服务器。

好。 这是简单的代码:

#!/usr/bin/perl
use strict;
use warnings;
use Carp;
use POSIX qw( setsid );
use IO::Socket;

my $server_port = get_server_port();

daemonize();

handle_connections( $server_port );

exit;

sub daemonize {
    chdir '/'                 or croak "Can't chdir to /: $!";
    open STDIN, '/dev/null'   or croak "Can't read /dev/null: $!";
    open STDOUT, '>/dev/null' or croak "Can't write to /dev/null: $!";
    defined(my $pid = fork)   or croak "Can't fork: $!";
    exit if $pid;
    setsid                    or croak "Can't start a new session: $!";
    open STDERR, '>&STDOUT'   or croak "Can't dup stdout: $!";
}

sub get_server_port {
    my $server = IO::Socket::INET->new(
        'Proto'     => 'tcp',
        'LocalPort' => 31236,
        'Listen'    => SOMAXCONN,
        'Reuse'     => 1,
    );
    die "can't setup server" unless $server;

    return $server;
}

sub handle_connections {
    my $port = shift;
    my $handled = 0;

    while ( my $client = $port->accept() ) {
        $handled++;
        print $client "Hi, you're client #$handled\n";
        chomp ( my $input = <$client> );
        my $output = reverse $input;
        print $client $output, "\n";
        print $client "Bye, bye.\n";
        close $client;
    }

    return;
}

请记住,这阻止了tcp服务器,因此它当时可以处理1个连接。 如果要大于1,它将变得更加复杂,并且必须问自己是否更喜欢多线程(或多处理),还是更喜欢单进程,基于事件的服务器。

您实际上并不想编写多线程perl。 Perl线程已损坏-它们无法正常工作(我认为)。

创建一个新的perl线程会克隆整个解释器,包括当前作用域中的所有数据-因此,与创建一个新进程(当然,它将使用写时复制)相比,这基本上是WORSE,并且用处不大。

因此,您绝对不希望它是多线程的。

如果可能的话,我将考虑使用AnyEvent之类的东西来替代纯线程方法。

我从来没有机会亲自尝试过,但是我相信POE在这种事情上受到高度重视。

这是一些用POE编写的TCP服务器的示例。

“已经开始|停止|重新启动的选项会很棒”

CPAN上有一些模块可以提供此功能。 例如,我可以看到Daemon :: Generic ,它声称是为daemon提供启动/停止/重载框架

/ I3az /

快速搜索发现了很多可能性。 Daemon :: Generic似乎很容易使用。

此外,还有许多用于各种协议的服务器模块。 实际上, HTTP :: Daemon已经成为核心模块已有一段时间了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM