见世界

简单实现一个分发模式

今儿上午又让我部署代码。
这就像大厦盖好了,没有电梯。添点物什都叫我背上去。这哪受得了。
心说,躲也躲不过,干脆在墙外给你装部电梯吧。

需求就是有15台win2008跑同一个程序,参数调整时需同步这些机器。(见上一篇假腿
废话少说,上代码。

deploy.pl
每分钟访问指定外网地址获取一行命令 ,若命令未改变,不做任何事。
否则,更新并执行命令。

#!/usr/bin/perl -w

#一个简单分发程序

use strict;
use warnings;
use LWP;
use Encode;

$| = 1;

while(1) {
my $agent = LWP::UserAgent->new();
my $response = $agent->get(‘外网地址,返回一行命令’);
my $cmd = $response->content;
print $cmd . “\n”;

open INPUT, "<run.bat";
my $old_cmd = <INPUT>;
$old_cmd = <INPUT>;

chomp($old_cmd);

unless ($cmd eq $old_cmd) {
    open FRH, ">run.bat";
    print FRH "title fake_visit\n";
    print FRH $cmd ;
    close FRH;

    system('taskkill /IM chrome.exe');

    my $kill_bat = 'taskkill /FI "windowtitle eq 管理员:  fake_visit"';
    $kill_bat = encode('gb2312', decode('utf-8', $kill_bat));

    #print $kill_bat . "\n";
    system($kill_bat);

    sleep(1);
    system('start run.bat');
}

close INPUT;

sleep(60);

}
run.bat

title fake_visit
python ./tudou.py –perIPCookies=200 –concurrent=35 –cycleTime=240

逻辑很简单,win杀死指定终端为难了我一下。(守护进程本身也是个cmd.exe)
设定title之后,win server自作主张在title前面加了个“管理员: ”,还有\s有木有?鬼知道那是什么啊。
翻遍手册发现taskkill不支持管道传参,perl system也难取到dos命令输出。输出到文件就有碍观瞻了……
最后还是脚踏实地用笨办法。
试得\s其实是两个空格。
由于perl文件是utf-8编码,win用的是cp936,转换一下,Ok

其实远可以做得更好,但是并没有给我分配时间(嗯,没错,我偷偷写的),python部分的变化也不是我能控制的。
本来设想,最好有个mysql作为中心,不过各种统计显然不需要我操心,就先这样吧。

如果是linux就省事多了,自带perl,crontab,ps一众工具。可以下载并执行代码,可以插crontab,如果建立一对相同的脚本互相调用,轮流执行,甚至可以让守护进程更新自己。啧啧,那就厉害了……