今儿上午又让我部署代码。
这就像大厦盖好了,没有电梯。添点物什都叫我背上去。这哪受得了。
心说,躲也躲不过,干脆在墙外给你装部电梯吧。
需求就是有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,如果建立一对相同的脚本互相调用,轮流执行,甚至可以让守护进程更新自己。啧啧,那就厉害了……