2008年最后一天了

今天 2008 年最后一天了,天气冷的很。到家的时候,脚都有些冻疼了。

2008年是个不太平的一年,发生了太多的事情。好多人都写了年度总结,我就不想再写一遍了。不过2008年总算是过去了。而且,从来没觉得一年会过得那么快。老了啊~~~

翻出了去年这个时候的日志,小小感慨了一下。有些事情还在继续纠结中,而另一些事倒有了变化。似乎我每年新年的时候都会纠结……

马上就是新的一年了,希望明年能更好,大家都能过的幸福。

 

用xinetd实现小型网络服务

linux 里带了一个 xinetd ,可以用来很方便地实现一些小型的网络服务。处理网络链接,fork 子进程等等都交给它来办,而我们自己只需要操作标准输入输出的程序就可以了。

先写一个简单的程序,我这里就写个php程序,其实用什么都是可以的,然后放在 /path/to/test-xinetd.php :
<?php
$in = fopen(‘php://stdin’, ‘r’);
$out = fopen(‘php://stdout’, ‘w’);
while ($r = fgets($in)) {
    $r = trim($r);
    if ($r == ‘exit’|| $r == ‘quit’) {
        break;
    }
    $nums = preg_split(‘/s+/’, $r);
    $result = array_reduce($nums, create_function(‘$a, $b’, ‘return $a + $b;’));
    fputs($out, “$resultn”);
}
fclose($in);
fclose($out);

这个程序读取输入的每一行,按空白分割,然后把这些都加起来。说白了就是做个加法。在输入 exit 或者 quit 的时候退出。可以先跑一下,看看效果。

然后就是用 xinetd 来把它变成一个服务了。

在 /etc/xinetd.d 里新增一个文件,比如叫 test ,在里面填上配置

service test
{
disable = no
socket_type = stream
protocol = tcp
port = 8888
user = root
server = /usr/bin/php
server_args     = /path/to/test-xinetd.php
wait = no
instances = 50
}
这里 disable = no 表示把这个服务启用;wait = no 是用多线程模式运行, instances 是最大实例数。其他几个参数就不用多解释了,看名字就知道。更多的配置可以去看底下的相关资料。

然后还需要在 /etc/services 里加上一条

test    8888/tcp

重启一下 xinetd,netstat -lntp 看一下 8888 端口是不是 xinetd 在监听了。

如果正常,就可以 telnet 127.0.0.1 8888 来看看了。

 

 

相关资料:
http://www.linuxfocus.org/English/November2000/article175.shtml
http://linux.vbird.org/linux_basic/0560daemons.php

用 gd 做网页截图

<?php
$browser = new COM(“InternetExplorer.Application”);
$handle = $browser->HWND;
$browser->AddressBar = false;
$browser->MenuBar = false;
$browser->ToolBar = false;
$browser->StatusBar = false;
$browser->FullScreen = true;
$browser->Visible = true;
$browser->Silent = true;

$url = “http://www.blogbus.com&#8221;;
$browser->Navigate($url);
echo $url,”n”;

while ($browser->Busy) {
    echo “.”;
    com_message_pump(1000);
}
$im = imagegrabwindow($handle, 0);
$browser->Quit();
imagepng($im, “e:/blogbus.png”);
imagedestroy($im);
echo “n”;
?>

基本上是照搬手册上的例子,稍稍改了一下。gd 里提供了一个 imagegrabwindow 函数,不过只能用在 windows 上。回头再好好研究下 linux 上有什么好办法。

看了《叶问》了

星期天看了《叶问》。我对电影不怎么关心,之前看到这个片名也没想到是功夫片,叶问这个名字看着也不像个大侠的名字。后来看了介绍才知道是怎么回事。不管之前怎么宣传,总归还要自己看了才算数。

剧情就不说了,已经有很多篇了。总体感觉上就是一部中规中矩的武打片,情节上也还是按照最标准的流程。但是从小高潮之后的轻松喜庆的桥段到日军入侵这个这么直接的切换还是感到有点点意外,有点点突兀。不过也把日军入侵前后的对比表现的很强烈。突然感觉有点像黄河协奏曲第三乐章从黄水谣到黄河怨那样。

叶问这个人物塑造得还是不错的。性格发展铺垫得都很到位,角色做的每一件事也都符合那个性格特点,这就感觉比较真实。

电影里的 Boss 三蒲倒是没把他描绘得十恶不赦,在片中没直接表现他本人做什么坏事,反倒是很重武道。可见电影里做了坏人就一定要坏到底。只要他再坏那么一点点,主角就活不了了。另外,从头到底的打斗都是一边倒,虽说不用像五小强那样,但叶问始终无敌让人看的就不是很有激情,呵呵。

 

让 nginx 用上 cronolog

nginx 的日志是不支持 |/path/to/cronolog 这样的写法的,不能直接支持 cronolog 来轮转日志。但是日志总是要拆分的。一般都是每天跑一个 crontab ,把原来的日志 mv 一下,然后 kill -USR1 让 nginx 重新打开日志文件。

以前想到过应该可以利用命名管道来做这事情,昨天去实践了一下。

先创建一个命名管道,

mkfifo /path/to/nginx/logs/access_log_pipe ,当然也可以直接用命名管道代替原来的日志文件。

然后让 cronolog 从这个文件读:

/path/to/cronolog /path/to/log/access_%Y%m%.log <  /path/to/nginx/logs/access_log_pipe &

把 nginx 的日志路径指到那个命名管道然后重启一下就可以了。之后在 nginx 的启动脚本里要把启动 cronolog 放在启动nginx 之前。