rsync多进程并发执行同步数据

“`
#!/bin/sh
#

src=’rsync://your.anrip.com:873′ #源路径
dst=’/mnt/backup’ #目标路径
dir=’project’ #待同步的项目

opt=”-rltPv –delete” #同步选项

num=32 #进程数
depth=’4 3 2 1′ #归递目录深度

skip=/tmp/`echo $src$dir | md5sum | head -c 16`.skip
[ -f $skip-next ] && cp $skip-next $skip
[ -f $skip ] || touch $skip

# 创建目标目录结构
rsync $opt –include “*/” –exclude “*” $src/$dir/ $dst/$dir

# 进入本地索引目录
cd $dst

# 从深到浅同步目录
for l in $depth ;do
# 启动rsync进程
for i in `find $dir -maxdepth $l -mindepth $l -type d`; do
if `grep -q “$i$” $skip`; then
echo “skip $i”
continue
fi
while true; do
now_num=`ps axw | grep rsync | grep $dir | grep -v ‘\-\-daemon’ | wc -l`
if [ $now_num -lt $num ]; then
rsync $opt $src/$i/ $dst/$i &
echo $i >>$skip-next
sleep 1
break
else
sleep 5
fi
done
done
done

# 最终单进程验证
while true; do
sleep 5
now_num=`ps axw | grep rsync | grep $dir | grep -v ‘\-\-daemon’ | wc -l`
if [ $now_num -lt 1 ]; then
rsync $opt $src/$dir/ $dst/$dir
break
fi
done
“`

Ubuntu下刷极路由不死uboot

今天帮朋友刷2个极路由的uboot,但他那边只有一台Ubuntu-Server可远程登陆。
悲剧的我,只好SSH连接他本地的Ubuntu,然后再连接极路由刷写固件:

**极路由1s**

“`
wget https://breed.hackpascal.net/breed-mt7620-hiwifi-hc5761.bin

scp -P 1022 root@192.168.199.1:/tmp/
ssh -p 1022 root@192.168.199.1
“`

*输入密码,登陆系统后,执行刷写命令*

“`
mtd write /tmp/breed-mt7620-hiwifi-mt7620.bin u-boot
“`

**极路由3**

“`
wget https://breed.hackpascal.net/breed-mt7620-hiwifi-hc5861.bin

scp -P 1022 root@192.168.199.1:/tmp/
ssh -p 1022 root@192.168.199.1
“`

*输入密码,登陆系统后,执行刷写命令*

“`
mtd write /tmp/breed-mt7620-hiwifi-hc5861.bin u-boot
“`

Ubuntu安装Docker/Redmine/GitLab教程

兴趣所致,使用Docker部署下Redmine和GitLab,体验下Docker的魅力。

**一、安装Docker**

**二、安装Redmie**

地址 http://172.20.1.15
账号 admin
密码 admin

**三、安装Gitlab**

地址 http://172.20.1.16
账号 root
密码 5iveL!fe

**集成安装脚本**

PS1:安全起见,以下绑定的地址均为本地IP,无法对外提供服务,如需部署到服务器请酌情修改。
PS2:也可以安装 rinetd 软件包,实现任意端口转发。

请下载下面的集成安装脚本,修改password和email参数后,一键安装Redmine/GitLab吧~

“`
#!/bin/bash
#
# Author Anrip
# Website http://www.anrip.com/post/1811
# Refs https://github.com/sameersbn/docker-gitlab
# Refs https://github.com/sameersbn/docker-redmine
#

if [ ! `which docker` ]; then
wget -qO- https://get.docker.com/ | sh
fi

docker network create –subnet=172.20.1.0/24 docker1

docker pull sameersbn/redis:latest
docker pull sameersbn/mysql:latest
docker pull sameersbn/gitlab:latest
docker pull sameersbn/redmine:latest

docker run –name app-redis -d \
–net docker1 –ip 172.20.1.11 \
–volume /srv/app-redis:/var/lib/redis \
sameersbn/redis:latest

docker run –name app-mysql -d \
–net docker1 –ip 172.20.1.12 \
–env ‘MYSQL_CHARSET=utf8’ \
–env ‘MYSQL_COLLATION=utf8_general_ci’ \
–env ‘DB_REMOTE_ROOT_NAME=root’ \
–env ‘DB_REMOTE_ROOT_PASS=password’ \
–volume /srv/app-mysql:/var/lib/mysql \
sameersbn/mysql:latest

MYSQL_CHARSET=”DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci”
cat > /opt/app-mysql/init.sql <>/etc/rinetd.conf
“`

使用ab进行压力测试遇到”Connection reset by peer”

Nginx作为前端服务器,当使用 **ab** 进行压力测试的时候遇到
*apr_socket_recv: Connection reset by peer*

由于linux内核已经是3.x,基本网上各种方法已经不再适用,现给出2.6.x以上内核的解决方案

“`
#按需加载内核模块
modprobe nf_conntrack_ipv4
modprobe nf_conntrack_ipv6

#按需修改网络参数
sysctl net.nf_conntrack_max=655360
sysctl net.netfilter.nf_conntrack_tcp_timeout_established=1200
“`

注:
1、重启后网络参数会还原,若需永久保存该参数请使用: `sysctl -w`
2、Debian/Ubuntu下单独安装ab测试工具: `apt install apache2-utils`

Linux中的$符号 — 读取命令行参数

在Ubuntu中一些经常使用的参数操作方法,脚本环境为 `sh` / `bash`

“`
#最后一个守护进程pid
echo ” last daemon process id : $! ”

#exit退出状态
echo ” exit status : $? ”

#当前脚本进程
echo ” process id of this script : $$ ”

#脚本名
echo ” script name : `basename $0` ”

#第一个参数
echo ” first param : $1 ”

#所有参数
echo ” all params : $* ”

#所有参数
echo ” all params : ‘$@’ ”

#参数长度
echo ” params length : $# ”

“`

以下一些扩展方法,需要 `bash` 环境

“`

#倒数第一个参数
#或 ${$#}, 但由于大括号中不能嵌套$符号, 要用!代替
echo ” last param : ${!#} ”
echo ” last param : ${@:${#@}} ”

#倒数第二个参数
echo ” last 2nd param : ${@:${#@}-1:1} ”

#最后两个参数
echo ” last 2 param : ${@:${#@}-1} ”

#从第二个到最后一个参数
echo ” from 2nd to last param : ${@:2} ”

#从第2个参数开始,连续2个参数
echo ” from 2nd, count 2 : ${@:2:2} ”

“`

Linux下SCSI磁盘热插拔

维护服务器时,有可能需要热插拔硬盘,但是Linux好像并不买单,不会自动检测磁盘的装卸,为此热插拔后,我们需要通知Linux服务磁盘状态。

“`
#添加磁盘,其中 2 0 1 0 分别对应 HOST CHAN DEV LUN
echo “scsi add-single-device 2 0 1 0” > /proc/scsi/scsi
#删除磁盘,其中 2 0 1 0 分别对应 HOST CHAN DEV LUN
echo “scsi add-single-device 2 0 1 0” > /proc/scsi/scsi
#查看磁盘
cat /proc/scsi/scsi
#命令输出
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
Vendor: NECVMWar Model: VMware IDE CDR00 Rev: 1.00
Type: CD-ROM ANSI SCSI revision: 05
Host: scsi2 Channel: 00 Id: 00 Lun: 00
Vendor: VMware Model: Virtual disk Rev: 1.0
Type: Direct-Access ANSI SCSI revision: 02
Host: scsi2 Channel: 00 Id: 01 Lun: 00
Vendor: VMware Model: Virtual disk Rev: 1.0
Type: Direct-Access ANSI SCSI revision: 02
“`

**参数解析:**
HOST 是硬盘所在SCSI控制器号(本例中,磁盘所在通道为2);
CHAN 是硬盘所在SCSI通道的编号(一般单通道的就是0,多通道的要看是哪个通道了);
DEV 是硬盘的SCSI ID号(可以通过具体插入的硬盘插槽来判断);
LUN 是硬盘的lun号(默认情况都是0)

PHP-FPM进程CPU占用100%之探索

服务器不时出现的CPU使用率超高、内存几乎被吃光的现象。top查看之,发现php-fpm进程高挂不下,于是根据Google总结如下方案:

一、检查PHP配置及代码

“`
#找出CPU使用率高的进程PID
top
#查看进程的内存使用情况
pmap PID
#跟踪进程执行的系统操作
strace -p PID
#查看该进程在处理的文件
ll /proc/PID/fd
“`

a.结合系统的内存大小,配置php-fpm的进程数(max_children)
b.将有可疑的PHP代码修改之,如:file_get_contents没有设置超时时间

二、启用php-fpm慢日志
本来不想加此方法,但是@phpsir提出了,我也放上来。
此日志是dump出脚本执行的过程到文本文件,相对比较直观,只是我感觉有时候找不到自己想要东西,可能还是不习惯这么用吧。大家可以尝试下。

三、强制结束高消耗进程

php-fpm 进程占用的内存超过 %5 就把它kill掉

“`
#!/bin/sh
fpms=`ps aux | grep php-fpm | grep -v grep | awk ‘{if($3>=5)print $2}’`
for fpm in $fpms; do
kill -9 $fpm
echo `date +’%F %T’` $fpm >>/var/log/php5/kill.log
done
“`

让Ubuntu支持exfat格式的U盘

“`
add-apt-repository ppa:relan/exfat
apt-get update

apt-get install exfat-fuse

mkdir /mnt/exfat
mount.exfat-fuse /dev/sdc1 /mnt/exfat
“`

add-apt-repository 是由 python-software-properties 这个工具包提供的,只有 ubuntu 09.10 之后版本支持。

/etc/syslog.conf文件解读

**1: syslog.conf的介绍**

对于不同类型的Unix,标准UnixLog系统的设置,实际上除了一些关键词的不同,系统的syslog.conf格式是相同的。syslog采用可配置的、统一的系统登记程序,随时从系统各处接受log请求,然后根据/etc/syslog.conf中的预先设定把log信息写入相应文件中、邮寄给特定用户或者直接以消息的方式发往控制台。值得注意的是,为了防止入侵者修改、删除messages里的记录信息,可以采用用打印机记录或采用方式来挫败入侵者的企图。

**2: syslog.conf的格式**

/etc/syslog.conf文件中的一项配置记录由“选项”(selector)和“动作”(action)两个部分组成,两者间用tab制表符进行分隔(使用空格间隔是无效的)。而“选项”又由一个或多个形如“类型.级别”格式的保留字段组合而成,各保留字段间用分号分隔。如下行所示:
*类型.级别 [;类型.级别] `TAB` 动作*

**2.1 类型 **
保留字段中的“类型”代表信息产生的源头,可以是:

“`
auth 认证系统,即询问用户名和口令
cron 系统定时系统执行定时任务时发出的信息
daemon 某些系统的守护程序的syslog,如由in.ftpd产生的log
kern 内核的syslog信息
lpr 打印机的syslog信息
mail 邮件系统的syslog信息
mark 定时发送消息的时标程序
news 新闻系统的syslog信息
user 本地用户应用程序的syslog信息
uucp uucp子系统的syslog信息
local0-7 种本地类型的syslog信息,这些信息可以又用户来定义
* 代表以上各种设备
“`

**2.2 级别**
保留字段中的“级别”代表信息的重要性,可以是:

“`
emerg 紧急,处于Panic状态。通常应广播到所有用户;
alert 告警,当前状态必须立即进行纠正。例如,系统数据库崩溃;
crit 关键状态的警告。例如,硬件故障;
err 其它错误;
warn 警告;
notice 注意;非错误状态的报告,但应特别处理;
info 通报信息;
debug 调试程序时的信息;
none 通常调试程序时用,指示带有none级别的类型产生的信息无需送出。如*.debug;mail.none表示调试时除邮件信息外其它信息都送出。
“`

**2.3 动作**
“动作”域指示信息发送的目的地。可以是:

“`
/filename 日志文件。由绝对路径指出的文件名,此文件必须事先建立;
@host 远程主机; @符号后面可以是ip,也可以是域名,默认在/etc/hosts文件下loghost这个别名已经指定给了本机。
user1,user2 指定用户。如果指定用户已登录,那么他们将收到信息;
* 所有用户。所有已登录的用户都将收到信息。
“`

**3: 示例**
我编译的MiLinux中使用了如下配置

“`
# First some standard log files.
*.*;auth,authpriv.none;mail.none /var/log/syslog
*.alert;*.crit;*.err /var/log/syserr
auth,authpriv.* /var/log/auth.log
mail.* /var/log/mail.log
# Emergencies are sent to everybody logged in.
*.emerg :omusrmsg:*
“`