分类存档: linux - 第2页

批量操作redis中的 key

批量操作redis中的 keys的方法:

1.统计个数:

redis中名称含有OMP_OFFLINE的key的个数;

redis-cli keys “*OMP_OFFLINE*” | wc -l

2.批量删除

批量删除 0号数据库中名称含有OMP_OFFLINE的key:
redis-cli -n 0 keys “*OMP_OFFLINE*” | xargs redis-cli -n 0 del

svn批量处理

批量添加文件至svn

svn update | awk '{if($1 == "?"){print $2}}' | xargs svn add

svn commit

 

 

批量解决 : Node remains in conflict

svn resolve --accept theirs-full .
svn update | awk '{if($1 == "Skipped"){print $2}}' | xargs svn resolved
svn update
svn resolve --accept theirs-full .

 

批量提交已经删除的文件

svn status | awk '{if($1 == "!"){print $2}}' | xargs svn rm

nginx proxy造成大量wait timeout连接

nginx使用的是1.4.5,发现产生了大量wait timeout,网上搜索得知需要指定为http 1.1及keepalive可大量减少wait-timeout连接。

修改配置添加keepalive字段到upstream。

<span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<code class=""><span class="line">upstream backend_abc {
</span><span class="line">    server   192.168.1.34:8086 weight=1 max_fails=2 fail_timeout=10s;
</span><span class="line">    server   192.168.1.77:8086 weight=1 max_fails=2 fail_timeout=10s;
</span><span class="line">    keepalive 16;
</span><span class="line">}</span></code>

同时修改配置添加http1.1声明和header中connection重写。

<span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<code class=""><span class="line">server {
</span><span class="line">        listen       80;
</span><span class="line">        ....
</span><span class="line">  location / {
</span><span class="line">            proxy_pass         http://backend_abc;
</span><span class="line">            proxy_http_version 1.1;
</span><span class="line">            proxy_redirect     off;
</span><span class="line">            proxy_set_header Connection "";
</span><span class="line">            ....
</span><span class="line">  }
</span>
<span class="line">    }</span></code>

ssh连上断开的session

网络不好时,ssh远程连服务器经常断掉,如果原来启动一个带输出的程序,断线重连后,无法继续看下原来的输出。

http://www.gnu.org/software/screen/

screen可以实现断线后继续连上原来的session,当然,ssh后,先启动screen,断线重连后,使用 screen -r即可以继续原来的session.

jenkens在mac下出现command not found

项目使用jenkens进行自动打包。

打包后生成的安装包上传至我们的ftp服务器供后续下载用。

上传使用的是lftp

一直提示:

/Users/sanx/Documents/sftp_upload_shell/moon_sftp_upload_10.234.10.12.sh: line 9: lftp: command not found

在网上搜索一下:http://stackoverflow.com/questions/12194294/command-not-found-in-jenkins-running-on-mac-machine

提示说可能是PATH的环境变量,jenkens使用的不相同。

于是输出登陆用户的PATH

sanxdeMac-mini-2:bin sanx$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

然后使用jenkens执行输出PATH

path1:/usr/bin:/bin:/usr/sbin:/sbin

lftp是使用的brew安装的,放在了/usr/local/bin目录下

sanxdeMac-mini-2:bin sanx$ which lftp
/usr/local/bin/lftp

找到问题就好解决了。

在/usr/bin下建一个链接,链至lftp,OK,问题解决。

mac os 上安装linux常用工具软件

推荐强大的

Homebrew

地址:http://brew.sh/

jenkins将mac os 建立为slave节点

我们手游项目,需要支持android/ios,android支持在linux下打包。ios必须要mac上进行打包。

持续集成我们使用了jenkins,找了一台mac mini做为slave。

一开始使用的是java web start。结果试了各种方法得到结论,java web start特别方便,最好不要在mac上使用,因为担心java的安全问题,mac上的java web start根本无法使用。

参考了文章:https://blog.samsaodev.com/how-to-setup-a-jenkins-slave-running-mac-osx-for-ios-projects-part-1/

在ssh-add那一步如果遇到:SSH_AGENT_FAILURE 错误,可以先执行下 eval $(ssh-agent) 试试能否解决问题。

使用ssh建立slave节点。

在mac os 上一直无法使用username/password模式登陆,发现原来mac os因为安全原因,禁止了没有交互的ssh登陆。这里只能使用rsa private key 进行登陆。

在master server上生成key。

然后将public key 复制至slave server。

登陆slave时失败了,查看slave server上的/var/log/secure:sshd[12053]:  Address 10.234.49.36 maps to localhost, but this does not map back to the address – POSSIBLE BREAK-IN ATTEMPT!

是因为:是因为DNS服务器把 10.234.x.x 的地址都反向解析成 localhost ,而DNS服务器不是自己的,不能改。 解决的办法就是,编辑 ssh 客户端的 /etc/hosts 文件,把出问题的IP 地址和主机名加进去,就不会报这样的错了。

两台机器之间使用ssh key登陆,默认使用本地当前的用户名,如果不是,则需明确指定用户名。

在jenkins上使用ssh key登陆时,密码必须为空。同时指定private key 所在路径。

OK,添加jenkins子节点成功。

svn服务器安装

mkdir -p /archive/download
mkdir -p /opt/compile

yum install apr apr-devel apr-util apr-util-devel gcc openssl openssl-devel


cd /opt/compile
tar xvfz /archive/download/httpd-2.2.21.tar.gz
cd httpd-2.2.21
LDFLAGS=”-L/lib64 -L/usr/lib64″ ./configure –prefix=/opt/apache2 –with-mpm=worker –enable-static-support –enable-module=rewrite -enable-dav -enable-so
#-enable-maintainer-mode
make
make install
cp /opt/apache2/bin/apachectl /sbin


tar xvfz /archive/download/subversion-1.7.9.tar.gz
cd subversion-1.7.9
yum install unzip
./get-deps.sh
./configure –prefix=/opt/subversion –with-apxs=/opt/apache2/bin/apxs –with-ssl –with-zlib=/usr/local/zlib
make
make install


vi httpd.conf
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
<Location /svn>
DAV svn
SVNParentPath /opt/svnroot/repository
AuthzSVNAccessFile /opt/svnroot/repository/authgroup
AuthType Basic
AuthName “Subversion Repository”
AuthUserFile /opt/svnroot/repository/authpass
Require valid-user
</Location>

mkdir -p /opt/svnroot/repository

svnserve -d -r /opt/svnroot

创建密钥文件、初始帐号
htpasswd  -c /opt/svnroot/repository/authpass yan
New password:

新增帐号
htpasswd  -b /opt/svnroot/repository/authpass newuser newpasswd

设置权限
vi /opt/svnroot/repository/authgroup
[groups]
admin=yan
test=tan

[/]
@admin = rw

[test:/]
@test = rw

—-

创建新的 project newApp
svnadmin create /opt/svnroot/repository/newApp


客户端
svn checkout http://192.168.1.x/svn/newApp

进入 newApp 目录,新建目录:
trunk
branches
tags
svn add/commit 准备好基础结构。

重新checkout
svn checkout http://192.168.1.x/svn/newApp/trunk
即可进入正常开发,以后根据需要为trunk目录增加branch、tag。

 

注:如果遇到以下问题

/usr/local/lib/libsvn_subr-1.so.0: undefined symbol: apr_hash_clear

这是因为httpd和subversion编译使用的apr和apr-util使用的库不相同造成的。

可以在编译httpd时指定–with-par 和 –withd-par-util参数来指定使用subversion相同的apr和apr-util来编译httpd.

LDFLAGS=”-L/lib64 -L/usr/lib64″ ./configure –prefix=/opt/apache2 –with-mpm=worker –enable-static-support –enable-module=rewrite -enable-dav -enable-so –with-apr=/opt/compile/subversion-1.7.9/apr –with-apr-util=/opt/compile/subversion-1.7.9/apr-util

在网上找到一个阿里云建VPN的一键脚本

#!/bin/bash

function installVPN(){
	echo "begin to install VPN services";
	#check wether vps suppot ppp and tun
	
	yum remove -y pptpd ppp
	iptables --flush POSTROUTING --table nat
	iptables --flush FORWARD
	rm -rf /etc/pptpd.conf
	rm -rf /etc/ppp
	
	arch=`uname -m`
	
	wget http://www.hi-vps.com/downloads/dkms-2.0.17.5-1.noarch.rpm
	wget http://wty.name/linux/sources/kernel_ppp_mppe-1.0.2-3dkms.noarch.rpm
	wget http://www.hi-vps.com/downloads/kernel_ppp_mppe-1.0.2-3dkms.noarch.rpm
	wget http://www.hi-vps.com/downloads/pptpd-1.3.4-2.el6.$arch.rpm
	wget http://www.hi-vps.com/downloads/ppp-2.4.5-17.0.rhel6.$arch.rpm


	yum -y install make libpcap iptables gcc-c++ logrotate tar cpio perl pam tcp_wrappers
	rpm -ivh dkms-2.0.17.5-1.noarch.rpm
	rpm -ivh kernel_ppp_mppe-1.0.2-3dkms.noarch.rpm
	rpm -qa kernel_ppp_mppe
	rpm -Uvh ppp-2.4.5-17.0.rhel6.$arch.rpm	
	rpm -ivh pptpd-1.3.4-2.el6.$arch.rpm

	mknod /dev/ppp c 108 0 
	echo 1 > /proc/sys/net/ipv4/ip_forward 
	echo "mknod /dev/ppp c 108 0" >> /etc/rc.local
	echo "echo 1 > /proc/sys/net/ipv4/ip_forward" >> /etc/rc.local
	echo "localip 172.16.36.1" >> /etc/pptpd.conf
	echo "remoteip 172.16.36.2-254" >> /etc/pptpd.conf
	echo "ms-dns 8.8.8.8" >> /etc/ppp/options.pptpd
	echo "ms-dns 8.8.4.4" >> /etc/ppp/options.pptpd

	pass=`openssl rand 6 -base64`
	if [ "$1" != "" ]
	then pass=$1
	fi

	echo "vpn pptpd ${pass} *" >> /etc/ppp/chap-secrets

	iptables -t nat -A POSTROUTING -s 172.16.36.0/24 -j SNAT --to-source `ifconfig  | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk 'NR==1 { print $1}'`
	iptables -A FORWARD -p tcp --syn -s 172.16.36.0/24 -j TCPMSS --set-mss 1356
	service iptables save

	chkconfig iptables on
	chkconfig pptpd on

	service iptables start
	service pptpd start

	echo "VPN service is installed, your VPN username is vpn, VPN password is ${pass}"
	
}

function repaireVPN(){
	echo "begin to repaire VPN";
	mknod /dev/ppp c 108 0
	service iptables restart
	service pptpd start
}

function addVPNuser(){
	echo "input user name:"
	read username
	echo "input password:"
	read userpassword
	echo "${username} pptpd ${userpassword} *" >> /etc/ppp/chap-secrets
	service iptables restart
	service pptpd start
}

echo "which do you want to?input the number."
echo "1. install VPN service"
echo "2. repaire VPN service"
echo "3. add VPN user"
read num

case "$num" in
[1] ) (installVPN);;
[2] ) (repaireVPN);;
[3] ) (addVPNuser);;
*) echo "nothing,exit";;
esac

注:这个脚本最后一步进行iptables转发时,会指向为阿里云的内网地址,需要手工操作一下,修改为公网IP。

nginx 日志切割

#!/bin/bash
## 零点执行该脚本
## Nginx 日志文件所在的目录
LOGS_PATH=/usr/local/nginx/logs
## 获取昨天的 yyyy-MM-dd
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
## 移动文件
mv ${LOGS_PATH}/access.log ${LOGS_PATH}/access_${YESTERDAY}.log

tar cvfz ${LOGS_PATH}/access_${YESTERDAY}.log.tar.gz ${LOGS_PATH}/access_${YESTERDAY}.log

## 向 Nginx 主进程发送 USR1 信号。USR1 信号是重新打开日志文件
kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)