netstat显示的连接状态有几种WAIT: FIN_WAIT_1,FIN_WAIT_2,CLOSE_WAIT和TIME_WAIT. 他们的含义要从TCP的连接中断过程说起

Server              Client
  -------- FIN -------->
  <------- ACK ---------
  <------- FIN ---------
  -------- ACK -------->

假设服务器主动关闭连接(Active Close)

  1. 服务器首先向客户机发送FIN包,然后服务器进入FIN_WAIT_1状态。
  2. 客户机向服务器确认FIN包收到,向服务器发送FIN/ACK,客户机进入CLOSE_WAIT状态。
  3. 服务器收到来自客户机的FIN/ACK后,进入FIN_WAIT_2状态
  4. 现在客户机进入被动关闭(“passive close”)状态,客户机操作系统等待他上面的应用程序关闭连接。一旦连接被关闭,客户端会发送FIN包到服务器
  5. 当服务器收到FIN包后,服务器会向客户机发送FIN/ACK确认,然后进入著名的TIME_WAIT状态

由于在连接关闭后,还不能确定所有连接关闭前的包都被服务器接受到了(包的接受是没有先后顺序的),因此有了TIME_WAIT状态。在这个状态中,服务器仍然在等待客户机发送的但是还未到达服务器的包。这个状态将保持2*MSL的时间,这里的MSL指的是一个TCP包在网络中存在的最长时间。一般情况下2*MSL=240秒。

No votes yet

很多脚本需要以root来执行,因此当前用户不是root的时候可以提示并引导用户获得root权限再执行。至少比看到一堆Permission Denied要友好一些。这里给出一个自动调用sudo的bash函数:

invoke_sudo() 
{ 
    if [ "`id -u`" != "`id -u $1`" ]; then 
        echo "`whoami`: you need $1 priviledge to run this application." 
        if [ "$AUTO_INVOKE_SUDO" == "yes" ]; then 
            echo "Invkoing sudo ..." 
            sudo -u "#`id -u $1`" bash -c "$2"
        fi 
        exit 0 
    fi 
}
# 使用方法是
#
# invoke_sudo root "$0 $@"


No votes yet

KeepAlive功能是在HTTP/1.1协议中要求实现的,用来保持客户机和服务器的长连接,执子之手与子偕老。通过减少建立TCP Session的次数来提高性能。常用的配置参数有{KeepAlive, KeepAliveTimeout, MaxKeepAliveRequests}。逐个说来:KeepAlive决定是否开启KeepAlive支持(On/Off);KeepAliveTimeout决定一个KeepAlive的连接的无请求状态最长保持的时间(以秒为单位), 时间一到就shutdown连接,若之后又有数据传输则必须再建立新的连接了;MaxKeepAliveRequests于 KeepAliveTimeout相似,意思是服务多少个请求就shutdown连接。看个例子:

KeepAlive On
KeepAliveTimeout 5

意思是说,打开KeepAlive,每个连接只保持5秒就中断。

对于KeepAlive的配置需要慎重,错误的参数可能导致严重的性能问题。一个高负载的Server,如果建立很多长连接将无法继续服务新的连接。因此需要根据server的性质调整KeepAliveTimeout或是MaxKeepAliveRequests的值。

例如:你的网页上有三幅图画2个外部javascript,他们都存放在你自己的server上。因此将MaxKeepAliveRequests设置为7比较合适。3幅图 2个js各一个link,网页本身一个link,还有firefox传说中的favicon.ico。当然还是要有KeepAliveTimeout的。如果客户机用了该死的IE并且设置了某个该死的选项,IE是不会向服务器发送HEAD请求查看图片(或是其他资源)是否过期的,而是直接使用本地图片。这个时候服务器是不会计算Request的(因为压根就没有Request嘛)。再如果只有MaxKeepAliveRequests参数,服务器会默认等待5秒才结束KeepAlive连接。通常这5秒可能玩死一个高负载的服务器。因此打开Firefox,启动Firebug,看看你的站究竟需要多少次请求,再决定KeepAlive吧。

No votes yet

Fusion-Icon是一个Compiz Fusion的TrayIcon。支持Theme Select, WM Reload等功能,使用起来十分方便。在Ubuntu 7.10下的安装方法:

git clone git://anongit.opencompositing.org/users/crdlb/fusion-icon
cd fusion-icon
sudo make interface=gtk install

然后在gnome的session里加入/usr/bin/fusion-icon, 如果使用ubuntu来启动compiz的话,就要在启动fusion-icon的时候加入参数-n,即 /usr/bin/fusion-icon -n

No votes yet

pkill & pgrep 是两个很方便的命令。省去了要先ps auwx | grep xxxx然后再根据pid kill的麻烦。例如,杀掉所有叫做wiki-import.pl的脚本

pkill -f wiki-import.pl

默认情况下,pkill & pgrep只会匹配启动程序的文件名。加上 -f 参数可以让pkill & pgrep 匹配整个命令行。比如,上面的例子就是为了匹配到“perl wiki-import.pl”.

pkill和kill一样可以向进程发送多种信号。例如:

pkill -STOP wiki-import.pl #暂停进程
pkill -CONT wiki-import.pl #唤醒进程
No votes yet

framebuffer和X都需要对分辨率进行设置,而gtf就是为此而生的工具。 使用:

gtf 1024768 60 -x

就可以轻松得到1024×768@60Hz的Modeline设置。

No votes yet

启动一个命名screen

screen -S shared

开启多用户模式

使用快捷键“Ctrl + A :” (注意还要打一个冒号)然后输入multiuser on来打开多用户模式

加入用户

使用快捷键“Ctrl + A :” (别忘记冒号)然后输入addacl ywayne,yuting,leiyh。加入ywayne, yuting, leiyh三个用户

设置用户只读权限

C-A: aclchg ywayne,yuting,leiyh -wx “#,?”
C-A: aclchg ywayne,yuting,leiyh +x “colon,detach,wall”

这里允许执行的三个命令里colon是指C-A之后输入的那个冒号(真不理解冒号也是命令!?)。detach是允许客户不想看的时候可以用C-A D离开screen(强奸客户们的意图是不好滴)。wall是让客户可以使用wall命令向所有发言,方便演示过程中提问。

客户登录

screen -x jianingy/shared

参考: http://www.pixelbeat.org/docs/screen/

No votes yet

通过/etc/ssh/ssh_config可以影响所有用户的ssh配置。而~/.ssh/ssh_config则是专门用来个性化你的ssh配置的。

例如: 主机dummy.foo.com的ssh端口在12345上面(为了防止密码猜解很多internet上的ssh都换了端口)。ssh_config里可以写入

Host dummy.foo.com
Port 12345

酱紫在命令行上使用ssh dummy.foo.com的时候端口号就默认为12345了。能够少输入不少字符。

No votes yet

周六新买的机器:

  • Althon 64 X2 4000+
  • KingMax 1G DDR800 × 2
  • BioStar TF7025-M2
  • MicroATX的机箱。

小机箱散热是不太好,盖上盖子会提高大概10C。最大惊喜就是这块MCP68S的mobo支持双屏输出,我把一个1280×1024的LCD和一个1680×1050的LCD放在一起玩Beryl简直太爽了.整体性能不错,系统装了Ubuntu amd64 版本。不用天天背着本本回家了,真好…

No votes yet

通过perl来给log里带有特殊单词的行加上颜色,带颜色的log更易于识别和阅读。

#!/usr/bin/env perl
while(<STDIN>) {
    s/($ARGV[0])/\033[1m\033[45m\1\033[0m/g if $ARGV[0];
    print "\033[1m\033[37m\033[41m" if /error/i;
    print "\033[1m\033[32m" if /info/i;
    print "\033[1m\033[32m" if /notice/i;
    print "\033[1m\033[36m" if /warn/i;
    print $_;
    print "\033[0m";
}
No votes yet