[英]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,并且用处不大。
因此,您绝对不希望它是多线程的。
我从来没有机会亲自尝试过,但是我相信POE在这种事情上受到高度重视。
“已经开始|停止|重新启动的选项会很棒”
CPAN上有一些模块可以提供此功能。 例如,我可以看到Daemon :: Generic ,它声称是为daemon提供启动/停止/重载的框架 。
/ I3az /
快速搜索发现了很多可能性。 Daemon :: Generic似乎很容易使用。
此外,还有许多用于各种协议的服务器模块。 实际上, HTTP :: Daemon已经成为核心模块已有一段时间了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.