wolfg's Weblog wolfg's journey with open source, linux, programming, sysadm ... 2011-08-04T15:02:53Z http://guoyong.org/feed/atom WordPress wolfg http://guoyong.org <![CDATA[九点验证doubanclaim3a434b2969bb75b4]]> http://guoyong.org/?p=640 2011-08-04T15:02:53Z 2011-08-04T14:31:11Z doubanclaim3a434b2969bb75b4

]]>
0
wolfg http://guoyong.org <![CDATA[MongoDB日志回滚]]> http://guoyong.org/?p=641 2011-06-02T00:53:39Z 2011-06-02T00:51:02Z
# kill -SIGUSR1 `cat /var/run/mongodb.pid`

用在shell脚本里时,命令要改成这样: kill -USR1 `cat /var/run/mongodb.pid`

参考:http://www.mongodb.org/display/DOCS/Logging#Logging-Rotatingthelogfiles

]]>
0
wolfg http://guoyong.org <![CDATA[RHEL5下编译MongoDB]]> http://guoyong.org/?p=630 2011-06-01T06:26:36Z 2011-06-01T06:21:29Z 很多人都说自己编译的稳定好用,我也来试试:

1. 参考官方文档,手工编译Spider Monkey

# curl -O ftp://ftp.mozilla.org/pub/mozilla.org/js/js-1.7.0.tar.gz
# tar zxvf js-1.7.0.tar.gz
# cd js/src
# export CFLAGS="-DJS_C_STRINGS_ARE_UTF8"
# make -f Makefile.ref
# JS_DIST=/usr make -f Makefile.ref export

2. 安装scons,用官网的rpm包就行。

3. 重新编译pcre。自带的编译时没带–enable-unicode-properties参数,mongdb启动时会提示:warning: some regex utf8 things will not work. pcre build doesn’t have –enable-unicode-properties. RPMS包是在这里找到的。

# rpm -ivh pcre-6.6-2.el5_1.7.src.rpm
# vi /usr/src/redhat/SPECS/pcre.spec
%configure --enable-utf8
修改成
%configure --enable-utf8 --enable-unicode-properties
# rpmbuild -ba /usr/src/redhat/SPECS/pcre.spec
# rpm -Uvh /usr/src/redhat/RPMS/x86_64/pcre*.rpm

4. 安装1.41版本的boost库。这里可以找到编译好的boost库的RPM包。因为后面要编译成静态库,还需要安装boost141-static-1.41.0-2.el5.i386.rpm

5. 开始编译MongoDB

# cd mongodb-src-r1.8.1
# scons --libpath=/usr/lib64/boost141/ \
   --cpppath=/usr/include/boost141/ \
   --release --64 --static all

如果你没有–release和–static选项,可能会看见下面这样的消息
*** notice: no readline library, mongo shell will not have nice interactive line editing ***
解决方法是加上–extralib=ncurses。

6. 安装

# cd mongodb-src-r1.8.1
# scons --libpath=/usr/lib64/boost141/ \
   --cpppath=/usr/include/boost141/ \
   --release --64 --static --prefix=/opt/mongo-1.8.1 install

参考:
1. http://www.mongodb.org/display/DOCS/Building+for+Linux
2. http://hi.baidu.com/farmerluo/blog/item/37364623f35ba55e9922ed2f.html

]]>
0
wolfg http://guoyong.org <![CDATA[在MacOS下使用天翼3G上网卡(华为EC1260)]]> http://guoyong.org/?p=603 2011-04-06T05:49:29Z 2011-04-05T13:11:00Z 关键是升级为华为的固件。

  1. 下载华为固件: 通用版客户端软件 中国电信(EC1260/EC1261/EC 189/EC8189/EC169/EC169C/EC122),下载页面
  2. 在使用Windows系统的电脑上运行升级程序。
  3. 在Mac电脑上插入上网卡,会自动运行,提示安装Mobile Partner这个应用程序。
  4. 运行Mobile Partner,在工具菜单里打开设置窗口,新建一个连接配置。号码是#777,用户名和密码都是card。
  5. 保存配置,就可以连接了。

]]>
0
wolfg http://guoyong.org <![CDATA[Using Postgresql]]> http://guoyong.org/?p=595 2010-08-24T06:05:05Z 2010-08-24T05:56:45Z 1. create tablespace
$ mkdir -p /home/postgresql/data
$ sudo chown -R postres:postres /home/postgresql/data
$ sudo chmod -R og-rx /home/postgresql/data
$ sudo su – postgres
$ psql
postgres=# create tablespace newspace location ‘/home/postgresql/data’;

2. move a database to this new tablespace
use a php script from here to generate sql
$ sudo yum install php-pgsql
$ ./generate-mv-db.php
$ sudo su – postgres
$ psql -d mydb -f migrate_localhost_mydb_newspace.sql

3. install postgis
a. install proj4.7
$ sudo yum install proj
b. install geos 3.2.2
$ tar xvjf geos-3.2.2.tar.bz2
$ cd geos-3.2.2
$ ./configure –prefix=/usr
$ make && sudo make install
$ sudo ldconfig

must do this, otherwise postgis will fail to locate libgeos_c.so.1

c. install postgis-1.5.1.tar.gz
$ tar xvzf postgis-1.5.1.tar.gz
$ cd postgis-1.5.1
$ ./configure
$ make && sudo make install
d. create a spatially-enabled database
$ sudo su – postgres
$ createdb postgis_template -U postgres;
$ cd /usr/share/pgsql/contrib/postgis-1.5
$ createlang plpgsql postgis_template
$ psql -d postgis_template -f postgis.sql
$ psql -d postgis_template -f spatial_ref_sys.sql

]]>
0
wolfg http://guoyong.org <![CDATA[给虚拟机的虚拟硬盘增加容量(vmdk file)]]> http://guoyong.org/?p=576 2010-03-14T06:10:29Z 2010-03-04T09:56:03Z 我使用虚拟机主要是为了使用Windows XP系统来访问网银、进行在线支付。当初安装时是用VMWare Player的,后来换成了VirtualBox 3。Windows XP越来越臃肿,虚拟机硬盘空间不够了。在网上搜索后找到了增加虚拟硬盘容量的方法:使用QEMNGParted,不用安装“庞大”的VMWare软件。特别说明一下最初创建虚拟硬盘时也是使用的QEMU工具。

具体步骤如下:
1. VMDK格式转成RAW格式

$ qemu-img convert -f vmdk winxp.vmdk -O raw winxp.raw

2. 新建一个RAW格式的文件,后面会用到

$ qemu-img create -f raw temp.img 512M

3. 用cat命令把temp.img多次追加到winxp.raw文件后,达到扩容的目的。

$ cat winxp.raw temp.img temp.img temp.img temp.img temp.img temp.img temp.img temp.img > winxp.img

4. 再转成原来的VMDK格式

$ qemu-img convert -f raw winxp.img -O vmdk winxp.vmdk

5. 用下载Gparted Live CD 的iso文件作为光盘启动虚拟机,可以看到硬盘物理空间已经变成了8G。修改硬盘上面的分区大小就行了,也可以创建新的分区。

参考:

www.cyberciti.biz/tips/howto-resize-vmware-virtual…

qemu-forum.ipi.fi/viewtopic.php?t=846&highlight=

]]>
0
wolfg http://guoyong.org <![CDATA[再谈使用Commons HttpClient产生大量CLOSE_WAIT]]> http://guoyong.org/?p=572 2010-02-02T07:16:12Z 2010-02-02T07:16:12Z 默认情况下(即用默认构造方法建立HttpClient对象),httpMethod.releaseConnection()方法并不会关闭连接的Socket,目的是可以重用这个连接。网上有不少讨论:

这些讨论里提出了关闭Socket的方法,即在请求头里加上”Connection: close”,具体可见HTTP协议规范里的说明

其实HttpClient 3.x 里还可以通过下面的方式建立HttpClient对象,来保证关闭Socket连接:

  1. HttpClient httpClient = new HttpClient(new SimpleHttpConnectionManager(true));

具体可见HttpClient源码和API文档。

当然,使用HttpClient的多线程连接管理器时就不用这么做了。

]]>
0
wolfg http://guoyong.org <![CDATA[SSH:不用密码登录]]> http://guoyong.org/?p=569 2010-01-30T08:32:11Z 2010-01-30T08:31:22Z 用SSH登录远程主机,每次都输入密码挺麻烦的,其实可以用密钥文件来登录:
1. 用ssh-keygen命令生成private/public密钥对,提示问题都用默认回答即可。

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/guoyong/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/guoyong/.ssh/id_rsa.
Your public key has been saved in /home/guoyong/.ssh/id_rsa.pub.

2. 用ssh-copy-id命令把公钥复制到远程主机上,user就是你登录用的用户名

$ ssh-cody-id user@remotehost

3. 验证一下吧

$ ssh user@remotehost echo "it works"
]]>
1
wolfg http://guoyong.org <![CDATA[nrpe使用一例]]> http://guoyong.org/?p=548 2010-01-28T07:24:18Z 2010-01-28T07:22:25Z NRPE的作用是在远程主机上运行Nagios插件,以便监控远程主机。

Ubuntu Server下安装NRPE很方便:

$ sudo apt-get install nagios-nrpe-server nagios-plugins

默认的几个检查命令(check_users, check_load等)都已经在/etc/naigos/nrpe.cfg和/etc/nagios/nrpe_local.cfg配置好了。在Nagios里配置监控服务使用类似如下的监控命令就可以了:

check_command                   check_nrpe!check_load

如果需要自定义监控命令,只需在/etc/nagios/nrpe_local.cfg里设置,重启NRPE服务,再在Nagios里配置监控服务即可。比如,要添加一个监控TCP各种状态的命令,步骤如下:

@remotehost
$ cd /usr/lib/nagios/plugins
$ sudo wget http://www.tuschy.com/nagios/plugins/check_tcp_count
$ sudo chmod +x check_tcp_count
$ cd /etc/nagios
$ sudo vi nrpe_local.cfg
command[check_tcp_count]=/usr/lib/nagios/plugins/check_tcp_count
$ sudo service nagios-nrpe-server restart

@nagioshost
$ sudo vi remotehost.cfg
define service{
        use                                  generic-service
        host_name                      remotehostname
        service_description        Tcp count
        check_command            check_nrpe!check_tcp_count
}
]]>
0
wolfg http://guoyong.org <![CDATA[使用Cacti监控JVM]]> http://guoyong.org/?p=512 2010-01-27T09:02:13Z 2010-01-27T08:55:59Z Cacti官方论坛里有几个监控JVM的模板:

导入到Cacti后,需要启用JVM的SNMP Agent,方法如下:
1. 启动JVM的参数里加入-Dcom.sun.management.snmp.port=9998 这个是指定SNMP Agent的监听端口。
2. 设置访问权限

$ sudo cp $JRE_HOME/lib/management/snmp.acl.template $JRE_HOME/lib/management/snmp.acl
$ sudo vi $JRE_HOME/lib/management/snmp.acl

acl = {
  {
    communities = public, private
    access = read-only
    managers = localhost
  }
}

trap = {
  {
    trap-community = public
    hosts = localhost
  }
}

3. 设置配置文件的权限,必须只能为启用JVM的用户只读,否则不能工作。(management.properties不用修改,使用默认配置即可)

$ sudo chmod 600 management.properties snmp.acl
$ sudo chown jetty management.properties snmp.acl

4. 重启JVM,用netstat命令检查9998端口是否已被监听或用snmpwalk命令检查。

$ sudo netstat -tlunp |grep 9998
$ snmpwalk -v 2c -c public localhost:9998 .1.3.6.1.4.1.42

5. 为了让远程的Cacti主机可以访问,可使用snmpd的proxy功能将请求转发到localhost的JVM SNMP Agent上。修改snmpd的配置文件,添加
proxy -v 2c -c public localhost:9998 .1.3.6.1.4.1.42
然后重启snmpd服务。在Cacti主机上以snmpwalk命令检查,应该能得到与上一步中snmpwalk命令一样的输出。snmpwalk -v 2c -c public remotehost .1.3.6.1.4.1.42
6. 至此,可以在Cacti里为JVM主机添加监控图表了,注意Device的SNMP Options配置里SNMP Version要选择Version 2。

参考:

]]>
6
wolfg http://guoyong.org <![CDATA[登录窗口有多个Xfce会话供选择,怎么回事?]]> http://guoyong.org/?p=558 2010-01-26T12:44:40Z 2010-01-26T12:44:40Z 登录窗口里选择会话的地方,一直有两个Xfce Session,登录后似乎略有不同。其实是在/usr/share/xsessions目录有一个符号链接default.desktop指向了xfce.desktop,删掉它后就可以了,也不影响什么。

]]>
0
wolfg http://guoyong.org <![CDATA[找回消失的Notification Area(Xubuntu)]]> http://guoyong.org/?p=556 2010-01-27T09:15:16Z 2010-01-26T11:48:43Z 美化桌面的时候会遇到通知区域(Notification Area)Applet不见了的情况,试图再加一个到面板上也会报类似“通知区域已经存在”的错误。

解决办法是检查~/.config/xfce4/panel目录下有没有名字以systray开头的文件,删掉这些文件。
rm ~/.config/xfce4/panel/systray*
再编辑~/.config/xfce4/panel/panels.xml这个文件,如果有一行包含systray的,也删掉。

再次登入后,重新添加通知区域到面板就可以了。

]]>
0
wolfg http://guoyong.org <![CDATA[再次遭遇大量CLOSE_WAIT]]> http://guoyong.org/?p=543 2010-01-22T14:04:56Z 2010-01-22T12:51:05Z 今天下午线上的Jetty服务又停止响应了。不过与上次不同的是,日志里没有Too many open files的问题(看来ulimit设置管用了),看不出任何问题。于是用netstat检查网络连接,发现了大量CLOSE_WAIT状态的连接,而且都是连接到同一个IP地址。联想到程序里有调用外部网站服务的部分,检查这个IP,正是其中的一个服务。检查代码,发现开发人员使用Commons HttpClient时出了问题,居然忘记关闭连接了(method.releaseConnection();)!!后果就是对方关闭了连接,连接不断地变成CLOSE_WAIT状态,直到耗尽所有的网络资源,没法再建立连接了。

从这个教训看出,项目的研发管理真是没有到位啊!快速反复的需求、几乎可以忽略的设计、缺少代码走查、没有单元测试,怎能保证上线前发现这样的问题!

]]>
0
wolfg http://guoyong.org <![CDATA[Services not starting on boot]]> http://guoyong.org/?p=524 2010-01-20T16:02:07Z 2010-01-20T16:02:07Z 前一段时间笔记本升级到Ubuntu 9.10后遇到了系统服务没有启动的问题,后来得知是upstart的一个bug。具体情况看看我在ServerFault回答的同样问题吧。

]]>
0
wolfg http://guoyong.org <![CDATA[遭遇”java.io.IOException: Too many open files”]]> http://guoyong.org/?p=520 2010-01-22T14:05:11Z 2010-01-20T08:47:21Z 今天下午,线上的Jetty服务宕机了,日志里大量的”java.io.IOException: Too many open files”错误。搜索到Freddy Chu的博客里正好有关于此的解决办法。

$ sysctl fs.file-max
$ lsof -u jetty -nn | wc -l
$ ulimit -a
$ sudo vi /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535

同时发现了系统里也有Freddy Chu提到的”Too many CLOSE_WAIT”问题,谢谢Freddy Chu。

$ sudo vi /etc/sysctl.conf
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_intvl = 2
net.ipv4.tcp_keepalive_probes = 2
net.ipv4.tcp_keepalive_time = 1800

$ sudo sysctl -p

Update(2010-01-21): root用户要特殊设置

$ sudo vi /etc/security/limits.conf
root soft nofile 65535
root hard nofile 65535
]]>
0