这两天比较空,刚看点了POE ,于是就用POE写了一个daemon,和crontab的作用差不多。主要是自己写的,控制方面更灵活一些。现在提供了基本的start,stop,restart,state方法。要加新的任务只要在指定目录中添加相应的模块就可以了。用起来还算是简单吧。不过POE是单进程的,不知道如果挂的任务多了会不会太慢。现在虽然写出了个框,以后却不一定用的上,以后弄服务器争取能用一下试试。
代码:
1 #!/usr/bin/perl
2
3
4 # Last Modified: <2006-02-21 16:37:57>
5
6 use strict;
7 use POE qw{
8 Component::Server::TCP
9 Component::Client::TCP
10 };
11 use FindBin ();
12 use File::Find ();
13 use Data::Dumper;
14
15 use constant PORT => 60000;
16 use constant MODULE_PATH => ''; # need absolute path
17
18 our $VERSION = 1.1;
19 our %Sessions;
20
21 main();
22
23 sub main {
24
25 #become_daemon();
26 my $cmd = $ARGV[0];
27 if ($cmd) {
28 if ($cmd eq 'start') {
29 start();
30 } else {
31 client($cmd);
32 }
33 } else {
34 usage();
35 }
36 POE::Kernel->run();
37 exit(0);
38 }
39
40 sub usage {
41 print "Usage: $0 start|stop|state|restart\n";
42 }
43
44 # daemon server
45
46 sub start {
47
48 # start daemon
49 POE::Session->create(
50 inline_states => {
51 start => \&load_module,
52 stop => \&stop,
53 restart => \&restart,
54 state => \&state,
55 check_session => \&check_session,
56 _start => sub {
57 $_[KERNEL]->alias_set('daemon');
58 $_[KERNEL]->yield('start');
59 },
60 }
61 );
62
63 POE::Component::Server::TCP->new(
64 Alias => 'daemon_server',
65 Address => "localhost",
66 Port => PORT,
67 ClientInput => \&server_command,
68 ClientDisconnected => sub {
69 $_[KERNEL]->post(daemon_server => 'shutdown') if $_[HEAP]->{stop_server} == 2;
70 },
71 InlineStates => { response => \&response, },
72 );
73 }
74
75 sub stop {
76 my ($kernel, $heap, $sender) = @_[ KERNEL, HEAP, ARG0 ];
77 if ($heap->{stop_client_handler}) {
78 $kernel->post($heap->{stop_client_handler}, 'response', 'OK:stop')
79 if ref($heap->{stop_client_handler});
80 delete $heap->{stop_client_handler};
81 } else {
82 $heap->{stop_client_handler} = $sender || 1;
83 stop_module($kernel);
84 $heap->{check_result} = 'stop';
85 $kernel->yield('check_session');
86 }
87 }
88
89 sub state {
90 my ($kernel, $heap, $sender) = @_[ KERNEL, HEAP, SENDER ];
91 my $msg;
92 for my $s (keys %Sessions) {
93 $msg = $kernel->call($s => 'state_session');
94 $msg = "Has problem, $!" if $!;
95 $kernel->call($sender, 'response', "$s : $msg");
96 }
97 $kernel->post($sender, 'response', "OK:Done");
98 }
99
100 sub restart {
101 my ($kernel, $heap, $sender) =
102 @_[ KERNEL, HEAP, ARG0 ]; # sender may shutdown, so do not use SENDER
103 if ($heap->{restart_client_handler}) {
104 load_module();
105 $kernel->post($heap->{restart_client_handler}, 'response', 'OK:restart')
106 if ref($heap->{restart_client_handler});
107 delete $heap->{restart_client_handler};
108 } else {
109 $heap->{restart_client_handler} = $sender || 1;
110 stop_module($kernel);
111 $heap->{check_result} = 'restart';
112 $kernel->yield('check_session');
113 }
114 }
115
116 sub check_session {
117
118 # check if session is stopped
119 my ($kernel, $heap) = @_[ KERNEL, HEAP ];
120 if (%Sessions) {
121 $kernel->delay_add(check_session => 0.5);
122 } else {
123 $kernel->yield($heap->{check_result});
124 }
125 }
126
127 sub load_module {
128 my $secord = 0;
129 my @modules = find_module();
130 for my $p (@modules) {
131 eval "require $p";
132 next if $@;
133 {
134 no strict 'refs';
135 *{"${p}::_stop"} = sub {
136 delete $Sessions{$p};
137 print "stop session ", $_[KERNEL]->alias_list, "\n";
138 };
139 *{"${p}::_start"} = sub {
140 my $k = $_[KERNEL];
141 $k->alias_set($p);
142 $k->sig(TERM => 'stop_session');
143 $k->delay_add('start_session', $secord);
144 };
145 unless (UNIVERSAL::can($p, 'stop_session')) {
146 *{"${p}::stop_session"} = sub { return 0; };
147 }
148 unless (UNIVERSAL::can($p, 'state_session')) {
149 *{"${p}::state_session"} = sub { return 'OK'; };
150 }
151 }
152
153 my @methods = find_method($p);
154 next unless @methods;
155 $Sessions{$p} = 1;
156 POE::Session->create(package_states => [ $p => [@methods] ]);
157 $secord++;
158 $secord = 0 if $secord > 60;
159 }
160 }
161
162 sub stop_module {
163 my $kernel = $_[0];
164 for my $s (keys %Sessions) {
165 $kernel->signal($s, 'TERM');
166 }
167 }
168
169 # client
170
171 sub client {
172 my $cmd = shift;
173 POE::Component::Client::TCP->new(
174 Alias => "daemon_client",
175 RemoteAddress => "localhost",
176 RemotePort => PORT,
177 Connected => sub {
178 $_[HEAP]->{server}->put("$cmd");
179 },
180 ServerInput => sub {
181 my ($kernel, $res) = @_[ KERNEL, ARG0 ];
182 local $| = 1;
183 print $res, "\n";
184 if ($res =~ m/^(OK|Error):(.*)$/) {
185 $kernel->yield('shutdown');
186 }
187 },
188 );
189 }
190
191 sub server_command {
192 my ($kernel, $heap, $cmd) = @_[ KERNEL, HEAP, ARG0 ];
193 $heap->{stop_server} = 0;
194 if ($cmd eq 'stop') {
195 $heap->{client}->put("Stopping...");
196 $heap->{stop_server} = 1;
197 $kernel->post(daemon => 'stop', $_[SESSION]);
198 } elsif ($cmd eq 'state') {
199 $heap->{client}->put("Checking...");
200 $kernel->post(daemon => 'state');
201 } elsif ($cmd eq 'restart') {
202 $heap->{client}->put('Restart...');
203 $kernel->post(daemon => 'restart', $_[SESSION]);
204 } else {
205 $kernel->yield(response => "Error: Bad command");
206 }
207 }
208
209 sub response {
210 my $heap = $_[HEAP];
211 $heap->{stop_server} = 2 if $heap->{stop_server};
212 $heap->{client}->put(join "\n", @_[ ARG0 .. $#_ ]);
213 }
214
215 # other
216
217 sub find_method {
218 my $package = shift;
219 my @methods;
220 no strict 'refs';
221 for my $k (keys %{"${package}::"}) {
222 if ($k !~ m/^__/ && UNIVERSAL::can($package, $k)) {
223 push @methods, $k;
224 }
225 }
226 return @methods;
227 }
228
229 sub become_daemon {
230 my $child = fork;
231 die "Can't fork: $!" unless defined($child);
232 exit(0) if $child; # parent dies;
233 POSIX::setsid(); # become session leader
234 open(STDIN, "</dev/null");
235 open(STDOUT, ">/dev/null");
236 open(STDERR, '>&STDOUT');
237 umask(0); # forget file mode creation mask
238 $ENV{PATH} = '/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin';
239 delete @ENV{ 'IFS', 'CDPATH', 'ENV', 'BASH_ENV' };
240 }
241
242 sub find_module {
243 my $dir = $FindBin::Bin;
244 my $regex = '\.pm$';
245 my @list;
246 my $pre_dir = $dir;
247 $pre_dir =~ s{[\\\/]}{::}g;
#cc
分享到:
相关推荐
标题中的"POE_POE_POE"以及描述中的"POE specification AG ITEM"指向的是PoE(Power over Ethernet)技术,这是一个在以太网电缆上同时传输数据和电力的技术。PoE允许网络设备,如IP电话、无线接入点、安全摄像头等...
例如,创建一个名为“gao”的POE配置文件,输入`[H3C]poe-profile gao`进入配置文件视图,然后分别设置优先级为关键(`[H3C-poe-profi le-gao]poe priority critical`),模式为信号检测(`[H3C-poe-profi le-gao]poe ...
- **IEEE 802.3bt**,于2018年发布,是目前最新的POE标准,引入了4对线供电(4PPoE),不仅提升了供电效率,还能提供最高90W的功率,扩展了POE应用范围,包括更高功率需求的设备如智能LED照明系统和高清晰度视频监控...
### PoE(以太网供电)测试概述 以太网供电(Power over Ethernet,简称PoE)技术是一种通过以太网线缆同时传输数据和电力的技术。它在安防监控、无线接入点、IP电话等场景中广泛应用。对于PoE设备来说,确保其符合相关...
标题中的“POE硬件方案设计资料”指的是使用Power Over Ethernet(POE)技术的硬件设计方案。POE是一种通过以太网线缆同时传输数据和电力的技术,它允许远程设备(如IP电话、无线接入点、网络摄像头等)只需要一根...
锐捷POE交换机配置实例 本文档将详细介绍锐捷POE交换机的配置实例,包括基本配置、安全设置、VLAN配置、路由配置等方面的知识点。 基本配置 在配置锐捷POE交换机之前,需要首先设置管理员用户名和密码。这里使用...
以太网POE供电技术是一种在以太网数据线上同时传输电力和数据的创新方法,大大简化了网络设备的安装和部署。Si3402B是一款专为以太网POE供电设计的集成电路,它提供了高效、稳定且可靠的电源管理解决方案。这款芯片...
《POE固件升级版本详解》 在现代网络设备中,POE(Power Over Ethernet)技术已经成为不可或缺的一部分,它允许通过以太网线缆同时传输数据和电力,大大简化了网络设备的部署与管理。而固件升级是保证POE设备稳定...
Power over Ethernet(PoE)是一种技术,允许通过以太网电缆同时传输数据和电力,减少了对额外电源设备的需求。在IT领域,PoE被广泛应用于网络摄像头、无线接入点、IP电话、LED照明和其他需要电源的物联网设备。下面...
【POE及POE电源简介】 POE,全称为Power Over Ethernet,中文称为“基于以太网线的供电技术”,是一种创新的供电解决方案。这项技术允许通过现有的以太网5类双绞线基础设施,为IP终端如IP电话、无线AP、便携式充电...
### 以太网POE供电EMC设计标准电路解析 #### 一、概述 随着网络技术的发展,以太网供电(Power over Ethernet, POE)技术因其便捷性、灵活性及可靠性等特点,在网络设备中得到了广泛应用。然而,由于POE设备在传输...
【图解POE防护方案电路的设计与选型】 随着POE(Power Over Ethernet)技术的广泛应用,设备在接收电力的同时也传输数据,这就对电源防护提出了更高的要求。本文旨在详细阐述POE防护方案电路的设计与选型,确保设备...
Poe可让您提问、获得即时回答、并与AI机器人互动对话。在Poe上与ChatGPT、GPT-4、Claude 2、DALLE 3以及数百万其他AI对话。该资源是POE的windows客户端,使用时请打开代理。
POE供电技术是指以太网供电技术(Power over Ethernet),它可以让设备通过网线接收电力,而不需要额外的电源适配器。这在远程设备如IP电话、无线接入点、网络摄像机等设备的供电中非常有用。POE供电电源转换涉及将...
POE供电IC—TPS23881中文资料 摘要:TPS23881是一款8通道电源设备(PSE)控制器,旨在按照IEEE 802.3bt标准向以太网电缆提供电力。这八个单独的电源通道可以按2线对(单通道)或4线对(双通道)PoE端口的任意组合...
PoE(Power over Ethernet,以太网供电)技术在IT行业中的应用正逐渐扩大,尤其在WLAN、VoIP、网络视频监控等领域的迅速发展背景下,PoE技术因其独特的优势,成为了解决网络设备供电问题的有效方案。本文将深入探讨...
本文将对楼宇可视对讲系统传统供电和POE供电两种供电方式进行比较和分析。 一、楼宇可视对讲系统供电方式概述 楼宇可视对讲系统供电方式主要有两种:传统供电和POE供电。传统供电方式是指使用独立的电源设备来供电...
Silabs Si3406x系列是Silicon Labs公司推出的一款高效、集成度极高的以太网供电+(PoE+)功率设备(PD)接口解决方案,主要用于实现IEEE 802.3at标准的PoE应用。该系列芯片设计旨在简化PoE+ PD设备的电源管理与控制,...
在Linux操作系统中,IP804A-POE供电芯片驱动是用于管理并控制IP804A芯片的软件组件,该芯片主要用于提供以太网供电(Power over Ethernet, POE)功能。POE技术允许通过以太网线缆同时传输数据和电力,简化了网络设备...
### 什么是POE及其关键技术解析 #### 一、POE技术概述 POE(Power Over Ethernet),即以太网供电技术,是一种能够在不改变现有以太网Cat.5布线基础设施的前提下,为基于IP的终端(例如IP电话、无线局域网接入点AP...