Press "Enter" to skip to content

月与灯依旧 Posts

Linux Shell判断字符串是否存在包含关系

在Pyhton里判断字符串是否存在包含关系非常简单,只要if a in b就行了,但如何在Shell中判断字符串的包含关系呢?

#! /bin/bash

var1="hello"
var2="he"

#方法1
if [ ${var1:0:2} = $var2 ]; then
    echo "1:include"
fi

#方法2
echo "$var1" | grep -q "$var2"
if [ $? -eq 0 ]; then
    echo "2:include"
fi

#方法3
echo "$var1" |grep -q "$var2" && echo "include" ||echo "not"

#方法4
[[ "${var1/$var2/}" != "$var2" ]] && echo "include" || echo "not"

其他方法:
expr或awk的index函数
${var#...}                  
${var%...}
${var/.../...}
2 Comments

Linux dd命令中dsync与fdatasync的区别

在Linux系统中经常会使用dd命令来测试硬盘的写入速度,命令会涉及到两个参数:dsync与fdatasync,本文介绍一下其区别。

dd if=/dev/zero of=/tmp/1Gbytes bs=4k count=256000 oflag=dsync

dd if=/dev/zero of=/tmp/1Gbytes bs=4k count=256000 conv=fdatasync

相信上述两个在Linux系统上使用dd测试磁盘INPUT性能的命令各位都看过,甚至使用过。
两个都是往硬盘中写入1 Gbytes的数据,只是第一个的速度慢的要命。

使用dsync,dd会从/dev/zero中,每次读取4Kbytes数据,然后直接写入到硬盘当中,重复此步骤,直到共读取并且写入了1 Gbytes的数据。
使用fdatasync,dd会从/dev/zero中一次性读取1 Gbytes的数据,写入到磁盘的缓存中,然后再从磁盘缓存中读取,一次性写入到硬盘当中。

/dev/在内存当中,和缓存一样,读取速度都非常快,因此两种方式最终的读取速度对最终的写入速度无任何影响。
换种说法,就是此处不管有没有的硬盘缓存,对IO都不产生任何影响。

那也就是说,两种方式的主要差异就在于多步与一步。

为什么写入速度会有如此大的差异?
看完这个比喻,你就会明白了:
现在有两辆一模一样的车,最高行驶速度为20 M/s,加速度为5 M/s^2,分别为甲车,乙车,他们都要走直线的,1000 M的路程。
甲车每次只能走四米,达到四米就得刹车,乙车可以一次性走完一千米。
相信大家也清楚,甲车还没加速到最高速度,就得刹车,走完这一千米需要不少时间。
而乙车,可以一直加速到其所能达到的最大速率,走完这一千米,花的时间明显比甲少。

Leave a Comment

家里的辣椒油蘸水做法

家里的辣椒油蘸水做法,记录一下。

切成粉末的姜和蒜
油+醋,各一半,或者油30%+醋70%
用油烫过的辣椒粉

出了盐之外,别的成分不必担心比例。

13 Comments

Shell之at命令(一定性定时计划任务)

at跟crontab一样,都是执行定时计划任务的命令。但不同的是,crontab执行的循环的任务,而at执行的是一次性任务,任务执行完以后便失效。

设置任务:

at now + 1 week -f a.sh      #a.sh必须已存在

at 01:35 < my-at-jobs.txt    
at < my.txt 01:35            #也可以把时间写在后面

at now +2 minutes <<< "mkdir 123"

at now +10 minutes <<ENDMARKER
rm -rf 123
echo successful done > /var/log/messages
ENDMARKER

查看所有任务:

at -l
atq

查看单个任务:

at -c ID

删除任务:

atrm 23
at -r 1

关于时间,可参考的语法:

Leave a Comment

CentOS 6安装lnmp+pptp+freeradius+daloradius

本文记录了在CentOS 6系统上安装lnmp + pptp + freeradius + daloradius的过程,已在原生CentOS 6、Linode、digitalocen等VPS上测试过均无问题。

一,安装LNMP
地址见http://lnmp.org/install.html,发布本文时,博主本人安装的是lnmp1.0版

安装完成需要作一些简单的优化,DaloRADIUS需要PEAR的DB插件,原生的LNMP并未安装pear,故这里也需要安装

编辑/usr/local/php/etc/php.ini,找到disable_functions,去掉scandir、fsockopen函数
ln -s /usr/local/php/etc/php.ini /etc/php.ini
wget http://pear.php.net/go-pear.phar
php -f go-pear.phar
按1(修改Installation base),输入/usr/local/pear
按5(修改PHP code directory),输入/usr/local/php/share/pear
按9(修改Public Web Files directory),输入/home/wwwroot
然后回车,提示alter php.ini,选择Y,一路回车

检查一下/usr/local/php/etc/php.ini,检查如下一行,如果没有就加上
include_path=".:/usr/local/php/share/pear"

ln -s /usr/local/pear/bin/pear /usr/bin/pear
pear install DB
/etc/init.d/php-fpm reload

二,安装pptp vpn

wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
yum install pptpd ppp dkms

mknod /dev/ppp c 108 0
echo "mknod /dev/ppp c 108 0" >> /etc/rc.local

编辑/etc/sysctl.conf
修改net.ipv4.ip_forward = 1
sysctl -p
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

iptables -F
iptables -X
iptables -Z
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
/etc/init.d/iptables save
/etc/init.d/iptables restart

/etc/init.d/pptpd start
chkconfig --level 2345 pptpd on
8 Comments

shell中的日期时间处理

在Shell中的一些常见的处理时间的方法,这里记录一下。

$ date                        #获得当前日期
Sat Sep  6 23:31:48 CST 2014

$ date +%Y%m%d                #获得当前日期
20140906

$ date +%Y.%m.%d-%H:%M:%S     #获得当前日期
2014.09.06-23:32:56

$ date -d "-1 week" +%Y%m%d   #获取上周今日的日期
20140830

$ date -d "+3 day" +%Y%m%d    #获得3天后的日期
20140909

$ date -d "+1 month" +%Y%m%d  #获得1个月后的日期
20141006

$ date -d "+2 month 20131231" +%Y%m%d  #获得2013年12月31日以后2个月的日期
20140303
Leave a Comment

CentOS 6安装gearman

CentOS 6 64bit安装gearman的过程。

1,安装gearman

yum install uuid-devel libuuid libuuid-devel uuid \
boost-devel libevent libevent-devel boost boost-devel \
gcc-c++ mysql-libs mysql libmemcached-devel libmemcached \
make curl libcurl-devel mysql-devel gperf

wget https://launchpad.net/gearmand/1.2/1.1.12/+download/gearmand-1.1.12.tar.gz

CFLAGS=-std=c99 ./configure
make
make install

启动Gearman服务端
/usr/local/sbin/gearmand -d -u root --log-file=/var/loggearmand.log

-b,--backlog= 储备的监听连接数量
-d, --daemon 后台运行
-f, --file-descriptors= 文件描述符的数量
-h, --help 帮助
-j, --job-retries= 在ob server移除不可用job之前运行的次数,防止不断运行导致其他可用worker崩溃。默认没有限制
-l, -log-file= 日志文件存放位置(默认记录最简单日志)
-L, --listen= 监听的IP,默认全部接受
-p, --port= 指定监听端口
-P, --pid-file= 指定进程ID写入位置
-r, --protocol= 加载协议模块
-q, --queue-type= 指定持久化队列
-t, --threads= 使用的I/9线程数量。默认为0
-u, --user= 启动后,切换到指定用户
-v, --verbose 增加一级详细程度
-V, --version 显示版本信息
Leave a Comment