gyn

Win32下的Perl,无用的select,停滞的Tk,结束吧....

Perl程序系统服务的实现办法

有人想要一个可以远程关机的程序,想了下似乎相当地简单,无非是一个 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 中定义了两个服务名称。

posted on 2008-12-19 09:12 gyn_tadao 阅读(714) 评论(0)  编辑 收藏 引用 所属分类: perl

只有注册用户登录后才能发表评论。
<2008年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

导航

统计

常用链接

留言簿(15)

随笔分类(126)

随笔档案(108)

相册

搜索

最新评论

阅读排行榜

评论排行榜