Archive for linux

同事使用mtop监控mysql和redis,redis没有流量监控,然后我写个脚本集成到mtop里边。然后查了相关资料snmp。 发现线上n多的负值,不知道问题,我本地没有问题。我查了64位系统的流量累加没有上限,后来同事说可能snmp是32位的,汗。我在redis流量表中类似mtop的操作,保存临时值然后清除,移动到history表中,也看不到具体问题在哪。我也不能有线上权限,让同事查我看,大约知道在4000多M的时候出现负的,差不多应该上限是4g。然后判断 new-old<0,就new+4096-old,然后没出现负值了。

Continue

安装snmp apt-get install snmp snmpd 编辑/etc/snmp/snmpd.conf配置文件, 1.将原有“agentAddress udp:127.0.0.1:161”改为: agentAddress 192.168.1.9 /*192.168.1.9为本机IP,即监控服务器要监控的主机IP*/ 2.加入一行如下: access MyROSystem "" any noauth exact all none none 3.将原有“rocommunity public default -V systemonly” 的"-V systemonly" 参数去掉,变成: rocommunity public default 4.将“#trap2sink localhost public”和“#informsink localhost public”前面的“#”去掉,改为: trap2sink localhost public informsink localhost public 5.重启SNMP服务: /etc/init.d/snmpd restart 6.检验snmp获取数据: snmpwalk -v 2c -c public 192.168.1.9 流量查询 snmpwalk -v 2c -c public 192.168.1.103 .1.3.6.1.2.1.2.2.1.16.2 send snmpwalk -v 2c -c public 192.168.1.103 .1.3.6.1.2.1.2.2.1.10.2 receive 查到的结果是总流量,需要取差值计算。 发现一篇好文章,http://www.freeoa.net/osuport/netmanage/get-host-net-traffice-info-by-snmp_1979.html 取得所有网/端口的描述 snmpwalk -v 2c -c public ipaddr ifDescr cisco交换机端口流量取值需要注意的问题: If interfaces are in trunk mode, you won't see them with that OID. CISCO-VLAN-MEMBERSHIP-MIB is only for non-trunking ports. You can try vlanTrunkPortDynamicStatus from CISCO-VTP-MIB to check. 得到机器的网络接口: snmpwalk -v 2c -c public 192.168.1.20 ifDescr or snmpwalk -v 2c -c public 192.168.1.20 .1.3.6.1.2.1.2.2.1.2 You should get a result like this: IF-MIB::ifDescr.1 = STRING: lo IF-MIB::ifDescr.2 = STRING: eth0 IF-MIB::ifDescr.3 = STRING: wifi0 IF-MIB::ifDescr.4 = STRING: ath0 IF-MIB::ifDescr.5 = STRING: br0 # snmpwalk -v1 -c public 192.168.1.20 ifDescr 取得网卡的进/出流量计数: # snmpwalk -v1 -c public 192.168.1.20 ifinOctets IF-MIB::ifInOctets.1 = Counter32: 0 IF-MIB::ifInOctets.2 = Counter32: 186740992 IF-MIB::ifInOctets.3 = Counter32: 4117381100 IF-MIB::ifInOctets.4 = Counter32: 3824919421 IF-MIB::ifInOctets.5 = Counter32: 569163 # snmpwalk -v1 -c public 192.168.1.20 ifoutOctets IF-MIB::ifOutOctets.1 = Counter32: 0 IF-MIB::ifOutOctets.2 = Counter32: 3824764209 IF-MIB::ifOutOctets.3 = Counter32: 305295003 IF-MIB::ifOutOctets.4 = Counter32: 168468497 IF-MIB::ifOutOctets.5 = Counter32: 172865 它们分别代表的意义 ifHCOutOctets OID 1.3.6.1.2.1.31.1.1.1.10 - outgoing traffic (bytes) ifHCInOctets OID 1.3.6.1.2.1.31.1.1.1.6 - incoming traffic (bytes) 取得交换机端口1的流量 statistic for port 1, then OID is: 1.3.6.1.2.1.31.1.1.1.10.1 使用SNMP RFC1213-mib定义进行流量分析 使用snmp管理网络设备,unix下常用net-snmp的snmpwalk,snmpget等,要得到网络的相关信息,可通过提取'RFC1213-mib'的定义值得到。例如:要取得远程主机的团体字为'public',IP为'192.168.1.20'的网络端口流入(IN)的数据流量,可以使用如下命令: snmpwalk -v 2c -c public 192.168.1.20 RFC1213-MIB::ifInOctets 返回各端口信息如下: IF-MIB::ifInOctets.112 = counter32:165070862 IF-MIB::ifInOctets是 rfc1213的定义端口流入数据量 112是查询网络设备的1模块插槽12端口 counter32后的数值就是该端口的流量:165070862 bits,在终端下可以通过shell命令取得这两个值 # 首先取得 12 接口的 ifIndex index=$(snmpwalk -v 2c -c public -IR 192.168.1.20 RFC1213-MIB::ifDescr |grep IF-MIB::ifInOctets.112 |cut -d ‘=’ -f 1|cut -d ‘.’ -f 2) # 再通过 snmp 协议取得 ififInOctets 和 ifOutOctets 的值 # 也可在 /etc/snmp.conf 中配置好'defVersion'和'defCommunity',这样 snmpget 命令不用指定这两个参数: eth12_in=$(snmpget -v 2c -c public -IR -Os 192.168.1.20 ifInOctets.${index}|cut -d ‘:’ -f 2|tr -d ‘[:blank:]‘) eth12_out=$(snmpget -v 2c -c public -IR -Os 192.168.1.20 ifOutOctets.${index}|cut -d ‘:’ -f 2 |tr -d ‘[:blank:]‘) echo $eth12_in echo $eth12_out 一般端口流量分析 针对普通网络设备的端口,MIB的相关定义是Interface组,主要管理如下信息: ifIndex 端口索引号 ifDescr 端口描述 ifType 端口类型 ifMtu 最大传输包字节数 ifSpeed 端口速度 ifPhysAddress 物理地址 ifOperStatus 操作状态 ifLastChange 上次状态更新时间 *ifInOctets 输入字节数 *ifInUcastPkts 输入非广播包数 *ifInNUcastPkts 输入广播包数 *ifInDiscards 输入包丢弃数 *ifInErrors 输入包错误数 *ifInUnknownProtos 输入未知协议包数 *ifOutOctets 输出字节数 *ifOutUcastPkts 输出非广播包数 *ifOutNUcastPkts 输出广播包数 *ifOutDiscards 输出包丢弃数 *ifOutErrors 输出包错误数 ifOutQLen 输出队长 其中,*号标识的是与网络流量有关的信息。 例如看看网络接口: #snmpwalk -v 1 222.90.47.169 -c public ifIndex 输出: IF-MIB::ifIndex.1 = INTEGER: 1 IF-MIB::ifIndex.2 = INTEGER: 2 IF-MIB::ifIndex.3 = INTEGER: 3 表示有三个网络接口 网络接口明成: [root@localhost snmp]# snmpwalk -v 1 222.90.47.169 -c public ifDescr IF-MIB::ifDescr.1 = STRING: lo IF-MIB::ifDescr.2 = STRING: eth0 IF-MIB::ifDescr.3 = STRING: ppp0 三个接口分别为 1 本地回路 2 以太网卡 3 ADSL连接 通过 snmp 协议取得 ififInOctets 和 ifOutOctets 的值 # snmpwalk -v1 -c public ipaddr ififInOctets/ifOutOctets 注意:端口的流量是一个累加值,即是从其加电工作开始到取数时,流经其的注意,因此这个数值是一直增加的。但受制于硬件的32位模式,处于32的系统下,这个值在超过4G后,会重新计数,64位系统没有这个限制。

Continue

早就想实现这么个功能,大部分不确定删除的时候,我都直接先移动到我用户的tmp目录下,这个目录我都放一些可删可不删的测试文件等。确定的我就直接删除。但是还有失误啥的,根本不可能预防所有情况。今天搜索一文章,正好实现。原理就是用一个新命令替换系统的rm命令。 原文http://www.webupd8.org/2010/02/make-rm-move-files-to-trash-instead-of.html。 1.sudo apt-get install trash-cli 原文有介绍这个工具,我也没用试试0 0。 2.sudo vim /usr/local/bin/trash-rm 文件内容

#!/bin/bash
# command name: trash-rm
shopt -s extglob
recursive=1
declare -a cmd
((i = 0))
for f in "$@"
do
case "$f" in
(-*([fiIv])r*([fiIv])|-*([fiIv])R*([fiIv]))
tmp="${f//[rR]/}"
if [ -n "$tmp" ]
then
#echo "\$tmp == $tmp"
cmd[$i]="$tmp"
((i++))
fi
recursive=0 ;;
(--recursive) recursive=0 ;;
(*)
if [ $recursive != 0   -a  -d "$f" ]
then
echo "skipping directory: $f"
continue
else
cmd[$i]="$f"
((i++))
fi ;;
esac
done
trash "${cmd[@]}"
12.04以上的版本,把最后一行的trash换成trash-put。 执行权限
sudo chmod +x /usr/local/bin/trash-rm

3.vim ~/.bashrc
替换命令,在文件最后添加
alias rm="trash-rm"
shell下执行bash,重载文件
搞定了。
 
http://www.webupd8.org/2010/02/make-rm-move-files-to-trash-instead-of.html

Continue

出现这个问题“ImportError: libsybdb.so.5”,先翻了 libsybdb.so.5这个文件,没翻到。然后找到了这个命令:locate libsybdb.so.5,直接将所有都列出来了。 我发现路径没问题,因为我是用的virtualenv环境,我以为是用户权限问题,找配置文件发现没问题。 然后从网上查,发现有的解决方法是将lib路径加入/etc/ld.so.conf中,我就看了本地ubuntu系统和centos的上的这个配置文件,发现确实是centos上的没添加lib路径。centos上我是编译安装的,不知为啥没加上,加入/usr/local/freetds/lib,然后ldconfig使配置生效。问题解决。

Continue

我要把mercurial-server的相关文件放到web项目里一起部署,于是想知道在apt-get安装mercurial-server时都执行了那些操作。官方没有手动安装的教程,我就查了整理一下。 开始找到这个命令,这个命令只会将一些安装的文件列出来,还有一些不知道什么用0 0.没有达到目的。 dpkg -x xxxx.deb xxxx 然后找到 ar vx xxxx.deb .deb其实是一个ar档,所以使用ar解压。 deb 包本身有三部分组成:数据包,包含实际安装的程序数据,文件名为 data.tar.XXX;安装信息及控制脚本包,包含 deb 的安装说明, 标识,脚本等,文件名为 control.tar.gz;最后一个是 deb 文件的一些二进制数据,包括文件头等信息,一般看不到,在某些软件中打开可 以看到。 control.tar.gz 则包含了一个 deb 安装的时候所需要的控制信息。一般有 5 个文件:control,用了记录软件标识,版本号,平 台,依赖信息等数据;preinst,在解包 data.tar.gz 前运行的脚本;postinst,在解包数据后运行的脚本;prerm,卸载时, 在删除文件之前运行的脚本;postrm,在删除文件之后运行的脚本。 搞定0 0. 参考: http://www.linuxdiyf.com/viewarticle.php?id=78628 http://www.baike.com/wiki/DEB%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F

Continue

在工作时服务器上环境的搭建,做个笔记记录。用到的东西主要有:django,nginx,supervisor,Gunicorn,virtualenv,mysql。 安装就略过了,每一个的文档上有介绍。virtualenv有一个virtualenvwrapper方便操作。 先安装virtualenv,然后在python虚拟环境里边安装django,gunicorn等相关库。 supervisor用来守护django网站启动的进程,默认配置文件添加/etc/supervisor/conf.d/name.conf

[program:code]
command=/home/sys/.virtualenvs/%(program_name)s/bin/gunicorn %(program_name)s.wsgi:application -c /home/www/%(program_name)s/%(program_name)s/gunicorn.conf.py
user=hg
directory=/home/www/%(program_name)s
autostart=true
autorestart=true
redirect_stderr=True
gunicorn.conf.py就是启动django的一些参数,制定监听的端口bind = "127.0.0.1:9006"。然后在nginx配置文件里边,进行转发。
server {
listen        80;
set $name "code";

server_name  code.xx.com;

root   /home/www/${name}/root;
access_log  /var/log/nginx/${name}.access.log;

location ~ (\.hg|\.orig|\.bak) {
deny all;
}

location /static/ {
expires max;
access_log off;
alias /home/www/${name}/static/;
}

location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass   http://127.0.0.1:9006;
}
}
supervisor的一些命令: 修改配置文件以后要使用supervisorctl update命令,否则不会更新。刚开始的时候,捣鼓了好长时间 才知道要这样搞0 0. supervisorctl start all启动所有进程, supervisorctl start code 单独启动code进程。 使用supervisorctl可以进入管理程序。

Continue

同事写在wiki上,和我说照装的,记录一下。 安装wine sudo add-apt-repository ppa:ubuntu-wine/ppa 1911  sudo apt-get update 1912  sudo apt-get install wine 安装gtk sudo apt-get install libgtk2.0-0:i386 不加386不行,我开始没有加,qq不能启动,报错了。 到http://www.longene.org/download/下载qq,并安装。 ubuntu搜狗谷歌输入法安装 ubuntu install sougoupinyin/googlepinyin 1. sudo apt-get remove --purge ibus 卸载Ubuntu 自带输入法 2. sudo add-apt-repository ppa:fcitx-team/nightly 添加源 3. sudo apt-get update 4. sudo apt-get install fcitx-sogoupinyin fcitx-googlepinyin

Continue

发现现在越来越懒,很多小问题都不再记录。要改正 1.生成一个新key

ssh-keygen
2.添加key ssh-add ~/.ssh/test 3.编辑~/.ssh/config 添加: Host woqu HostName 192.168.1.118 IdentityFile /home/a0x55aa/.ssh/test 4.项目.hg/hgrc修改 [paths] default = ssh://hg@woqu/test/haha   还有一种方法: 定义hgrc里边[ui],ssh
ssh = ssh -i ~/.ssh/test -C
编辑的时候使用 hg clone -e 'ssh -i /path/to/key' ssh://user@host/path

Continue

开始提示, File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/dialects/mssql/pymssql.py", line 72, in _get_server_version_info r"Microsoft SQL Server.*? - (\d+).(\d+).(\d+).(\d+)", vers) File "/usr/lib/python2.7/re.py", line 137, in match return _compile(pattern, flags).match(string) TypeError: expected string or buffer 然后我打印了vers,发现为None,然后有修改连接字符串,发现不是连接的错误。 然后使用~$ sqsh -U sa -P 123456 -S 192.168.1.21, 1> select @@version 2> go 正确的打印了版本信息,这也不可能是我sqlserver的问题了。 为什么就会为None了呢,shell下直接用pymssql 执行select语句也都返回None。 这期间各种搜索。。各种啊,,没有找到有用的信息,啥都有。 然后 搜索 pymssql no data 发现google都有好多关键字提示。。。然后搜到了问题。 http://stackoverflow.com/questions/7250464/python-and-pymssql https://bugs.launchpad.net/ubuntu/+source/pymssql/+bug/918896

$ apt-get remove python-pymssql
$ apt-get install freetds-dev
$ pip install Cython
$ pip install pymssql

就好了,我之前好像也是用apt-get安装的 因为我看编译需要依赖库,就没有安装,
直接apt-get了。fretds我是安装了的,Cython之前没有安装。不知道与Cython有没关系。
今天部署的时候发现好像是版本的问题,用1.0.2有这个问题,去下载dev 30130403没问题。。。

Continue

1.按照zeromq。下载地址:http://download.zeromq.org/ 官方文档 http://zeromq.org/area:download#toc4 2.安装pyzmq。easy_install pyzmq   不错的例子:https://learning-0mq-with-pyzmq.readthedocs.org/en/latest/index.html   我用的pair-pair模式,虽然我只要单向传递消息,这种模式不会产生消息丢失。我开始使用pub-sub模式,发现不知道什么原因,第一个消息总会丢失。。。这种模式是最快的,然后决定不使用了。但是使用pair模式存在的问题是,如果接收端的服务没启动,就会阻塞在那里,会产生timeout。

Continue