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

如何在Perl中创建TCP服务器守护进程?,perl,Perl,我希望用Perl创建一个TCP服务器守护进程 哪一个是最好的框架/模块 有什么东西是与Perl捆绑在一起的吗 编辑:有启动|停止|重新启动选项的东西会很好 编辑:它必须是一个多线程服务器。好吧,最好能说明这个守护进程应该做什么。因为有专门的框架/库用于各种任务 对于不做任何事情的最简单的守护进程,您可以轻松地执行以下操作: #!/usr/bin/perl use strict; use warnings; use Carp; use POSIX qw( setsid ); daemonize(

我希望用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: $!";
}
子daemonize()已从中提升(有微小更改)

仅此而已-代码现在可以正确地后台处理,并且可以执行任何您想要的操作

我刚看了你们的编辑,你们想要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;
}
#/usr/bin/perl
严格使用;
使用警告;
使用鲤鱼;
使用POSIX qw(设置ID);
使用IO::Socket;
my$server_port=get_server_port();
daemonize();
处理\u连接($server\u端口);
出口
亚守护{
chdir“/”或croak“不能chdir到/:$!”;
打开STDIN,“/dev/null”或croak“无法读取/dev/null:$!”;
打开STDOUT,“>/dev/null”或croak“无法写入/dev/null:$!”;
定义(my$pid=fork)或发出“不能分叉:$!”;
如果$pid,则退出;
setId或croak“无法启动新会话:$!”;
打开STDERR,“>&STDOUT”或croak“无法复制STDOUT:$!”;
}
子获取服务器端口{
my$server=IO::Socket::INET->new(
“Proto”=>“tcp”,
“本地端口”=>31236,
“听着”=>SOMAXCONN,
“重用”=>1,
);
除非$server,否则“无法设置服务器”;
返回$server;
}
副把手连接{
我的$port=shift;
我的$handled=0;
而(我的$client=$port->accept()){
$handled++;
打印$client“您好,您是客户#$handled\n”;
chomp(我的$input=);
my$输出=反向$输入;
打印$client$输出,“\n”;
打印$client“再见,再见。\n”;
关闭$client;
}
返回;
}

请记住,这是阻塞tcp服务器,因此它将能够同时处理1个连接。如果您想要的不止1个-它会变得更复杂,您必须问问自己,您是更喜欢多线程(或多处理),还是更喜欢单进程、基于事件的服务器。

我自己从来没有机会尝试过,但我相信它在这类事情上受到高度重视

这是

“有启动|停止|重新启动选项的东西会很好”

有一些模块将提供此功能。例如,我可以看到哪个声称是为守护进程提供启动/停止/重新加载的框架


/I3az/

您实际上并不想编写多线程perl。Perl线程坏了——它们不能正常工作(在我看来)

创建一个新的perl线程会克隆整个解释器,包括当前作用域中的所有数据——因此,基本上比创建一个新进程(当然,它将使用写时复制)更糟糕,而且用处更小


<>你肯定不希望它有多线程。

如果可能的话,我会考虑用一些类似于纯线程方法的方法。

揭示了相当多的可能性。使用起来似乎很简单


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

什么样的服务器?有用于实现HTTP服务器、SMTP服务器等的模块,为什么它必须是多线程的?有很多方法可以实现并发性(假象),为什么其他选项不在考虑范围内呢?我正在编写一个TCP服务器daemon.thanx作为回复。但是,是的,我确实需要使它成为一个多线程服务器。所以,首先,重申你的问题。对不起,我猜不出你需要什么。想想你需要什么,试着写下来。我不会为您编写代码。@depesz:我从来没有要求提供示例代码,但无论如何还是要谢谢您。我正在寻找一个现有的perl模块,它可以通过线程很好地实现这一点。问这个问题的原因是,我搜索了cpan,发现了很多实现,我不知道哪一个是最好的。然后是“tcp服务器,daemonized”。现在它是“多线程tcp服务器,后台监控”。几分钟后,它将成为“多线程、基于tcp的、聊天服务器、后台监控”。尽可能具体地问你的问题。不要让我们猜测您真正需要什么。那么您的建议是,用perl编写多线程tcp服务器是个坏主意?但我读到perl线程在V5.8上运行良好。perl线程运行良好,但需要注意的是,它们比启动整个单独的进程消耗更多内存,启动时间更长;他们不能很容易地共享变量,锁定很糟糕。基本上,它们的设计很糟糕,如果不破坏与任何使用它们的程序的兼容性,它们是无法修复的。