有人想要一个可以远程关机的程序,想了下似乎相当地简单,无非是一个
cs
的
socket
,发一个命令过去,然后调用关机指令“
shutdown -s -t 0
”,于是机器就关掉了。很快就写完了,即使行而已的小玩意儿,转念一想总不好让要被关的机器整天开着个黑乎乎的命令行窗口吧,所以自然想到了要把它做成一个系统服务。
说起来,
pdk
的更新算是挺勤快的,一转眼到
7.3
了。其中有一个功能就是用来创建
win
下的系统服务的,但首先必须要遵循一些规则。
具体的可以在帮助文档里找到,这里只是简要地说明一些必要的东西,并举一个例子来说明。有三个东西时一定要定义的,分别是
$PerlSvc::Name
、
$PerlSvc::DisplayName
和
PerlSvc::startup()
,即服务名称、控制面板中显示的服务名称和主程序(也就是服务启动时要运行的程序)。其他的都是可有可无的,对于这么一个简单的东西,完全没有必要。
package PerlSvc;
our %Config;
sub Startup {
while (ContinueRun()) {
$local_addr=pack('SnC4x8', 2, 32080, 127,0,0,1);
socket(FILE_TRANS_SERV, 2, 1, getprotobyname('tcp')) or die("socket failed for $!");
bind(FILE_TRANS_SERV, $local_addr) or die("bind failed for $!");
listen(FILE_TRANS_SERV,3);
$remote_addr = '';
for(; $remote_addr=accept(FILE_TRANS_CLIENT,FILE_TRANS_SERV); close(FILE_TRANS_CLIENT)){
$in = <FILE_TRANS_CLIENT>;
while (<FILE_TRANS_CLIENT>) {}
if ($in =~ 'shutdown') {
close(FILE_TRANS_CLIENT); close(FILE_TRANS_SERV);
system "shutdown -s -t 0";
}
}
close(FILE_TRANS_SERV);
}
}
sub Pause { }
sub Continue { }
sub Interactive { }
sub Help { }
sub Install {
$Config{ServiceName} = 'MyShutdownService';
$Config{DisplayName} = 'My Shutdown Service';
}
sub Remove {
$Config{ServiceName} = 'MyShutdownService';
}
package main;
1;
在
startup
中,我开了一个监听
socket
,等待接收关机指令,另外最好将socket的建立和注销过程写在一个while循环中,避免不必要的逻辑错误。在
Install
中定义了两个服务名称。