Linux Shell之数组

一,数组定义
[code]
定义方法1
arr=(1 2 3 4 5) #用空格分开

定义方法2
array
array[0]="a"
array[1]="b"
array[2]="c"

定义方法3
str=“a b c”
array=($str)
[/code]

二,数组调用及遍历
[code]
${#array[@]} #获取数组的长度
echo ${array[@]} #遍历数组(输出数组全部元素)
array[0]=5 #向数组的某个元素赋值
echo ${array[@]:1:2} #输出array[0]和array[1]的值
echo ${array[@]:2} #输出数组第三个元素以后的值
echo ${array[@]::2} #输出数组下标小于2的值
$ echo ${#array[3]} #取得元素3的长度
unset array #清除array
array= #清空array的值

遍历(For循环法)
for i in ${arr[@]}
do
echo $i
done

遍历(For循环法2)
for ((i=0;i<${#array[@]};i++))
do
echo ${array[$i]}
done

遍历(while循环法)
len=${#arr[@]}
i=0
while [ $i -lt $len ]
do
echo ${arr[$i]}
let i++
done
[/code]

每隔30秒,查找名为ndh2nds的进程,找出其pid,修改/proc/$pid/oom_score_adj的值,防止该进程被OOM机制杀掉
[code]
#!/bin/bash

while :
do
list=`ps -ef | grep -i ndh2nds | grep -v ‘grep ‘ | awk ‘{print $2}’`
array=($list)
for pid in ${array[@]}
do
score=`cat /proc/$pid/oom_score_adj`
echo oom_score_adj of pid $pid is $score
if [ $score -ge 0 ]; then
echo -100 > /proc/$pid/oom_score_adj
echo changed oom_score_adj of pid $pid to `cat /proc/$pid/oom_score_adj`
fi
done
sleep 30
done
[/code]

Linux Shell之括号用法

一,单小括号()
1,命令组。括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。
2,命令替换。等同于`cmd`,shell扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其标准输出,再将此输出放到原来命令。有些shell不支持,如tcsh。
3,用于初始化数组。如:array=(a b c d)

二,双小括号(( ))
1,整数扩展。这种扩展计算是整数型的计算,不支持浮点型。((exp))结构扩展并计算一个算术表达式的值,如果表达式的结果为0,那么返回的退出状态码为1,或者 是”假”,而一个非零值的表达式所返回的退出状态码将为0,或者是”true”。若是逻辑判断,表达式exp为真则为1,假则为0。
2,只要括号中的运算符、表达式符合C语言运算规则,都可用在$((exp))中,甚至是三目运算符。作不同进位(如二进制、八进制、十六进制)运算时,输出结果全都自动转化成了十进制。如:echo $((16#5f)) 结果为95 (16进位转十进制)
3,单纯用 (( )) 也可重定义变量值,比如 a=5; ((a++)) 可将 $a 重定义为6
4,双括号中的变量可以不使用$符号前缀。括号内支持多个表达式用逗号分开。
[code]
#判断大小
if ($i<5)
if [ $i -lt 5 ]
if [ $a -ne 1 -a $a != 2 ]
if [ $a -ne 1] && [ $a != 2 ]
if [[ $a != 1 && $a != 2 ]]

#输出数0到4
for i in $(seq 0 4);do echo $i;done
for i in `seq 0 4`;do echo $i;done
for ((i=0;i<5;i++));do echo $i;done
for i in {0..4};do echo $i;done
[/code] 继续阅读

Linux之setfacl权限配置

查看setfacl版本
[code]
$ setfacl –version
setfacl 2.2.49
[/code]

查看文件系统是否开启acl权限控制
[code]
$ tune2fs -l /dev/sda3 | grep option
Default mount options: acl
[/code]

开启acl支持
[code]
方法一:修改mount选项
$ mount -o remount,acl /dev/vda3 /mnt/acltest
$ vim /etc/fstab
/dev/vda3 /mnt/acltest ext4 defaults,acl 0 0

方法二:使用tune2fs修改文件系统信息
$ tune2fs -o acl /dev/vda3 开启文件系统的acl选项
$ tune2fs -o ^acl /dev/vda3 取消文件系统的acl选项
[/code]

给某个用户设置权限
[code]
$ setfacl -m u:joe:rx dir
[/code]

给某个组设置权限
[code]
$ setfacl -m g:aclgp1:rx dir
[/code]

取消某项权限
[code]
$ setfacl -x g:aclgp1 dir
[/code] 继续阅读

使用UEFI模式安装Windows7

最近入了个微星 H81-E43的主板,在安装系统的时候遇到了问题,BIOS中只能设定uefi和legacy共存,不能设定legacy only。
legacy是传统BIOS,uefi是传统BIOS的升级版。在UEFI模式下安装的系统(只支持64为系统且磁盘分区必须为gpt格式,不支持32位),只能用UEFI模式引导。

注意事项
1,目前UEFI/GPT仅仅支持64位系统启动安装;
2,UEFI/GPT下安装的win7 x64不能用常用的软激活激活,只能通过刷BIOS激活或者正版激活码激活;
3,GPT是为大容量硬盘而生的,不大于2T的硬盘理论上不建议使用GPT分区,如果主板可以设定legacy only,还是老老实实使用MBR格式吧

BIOS设置
1,打开UEFI支持
把“Boot mode”项设为“UEFI only”;如果有“Lunch CSM”选项,将其设为“Enabled”。
2,关闭安全引导(假如有的话)
进入“Security”-“Secure Boot”,将其设为 “Disabled”。这是Windows8新引入的安全机制,不关闭不能安装其它操作系统。

安装步骤 继续阅读

国内一线IT公司运维工程师试题

最近面试了许多公司的运维工程师岗位,博主再一次深深感受到了Linux就业者的难处。Linux这个东西牵扯的方面太多了,而大部分公司只能用到其中的某一两个方面,假设你没有涉及过这一两个方面的话,那么就只能over了,所以Linux从业者的路其实比较窄。
去A公司面试,会问你云计算,虚拟化方面的问题,
去B公司面试,会问你RAID、IPMI方面的问题,
去C公司面试,会问你Shell、Python方面的问题,
去D公司面试,会问你kernel、编译方面的问题……
去E公司面试,会问你Hadoop、MapReduce方面的问题……

这一两个月来,面试过大大小小不下数十家IT公司了,其中不乏一些国内顶尖的互联网公司(如百度等),下面列举一些曾经把我难倒的问题。这些问题里,有的我已经知道答案,有的至今无解。想走Linux运维工程师的你,不妨也来试试吧。

需要说明的是,本篇博文的标题是“国内一线IT公司运维工程师试题”,因此下面列出的这些都是我认为有些深度的题目,而实际上在面试的过程中,有些不太知名的公司,题目会简单许多,例如写一些简单的Shell脚本,描述一下Linux的启动过程等,这些问题我都没有列出来。。

假设有某日志文件:
08:35:04 1 98.35.12.254 visited some thing.
10:20:09 6 199.198.25.4 visited some thing.
12:05:25 8 35.27.8.16 visited some thing.
……
16:30:55 3 128.99.33.64 visited some thing.
已知第一列是时间,第二列是随机的数字,第三列是客户端IP,第四列是一些文字。

1,请筛选出下午14:00以后,访问最频繁(访问次数最多)的三个客户端IP,可以写脚本实现;(百度,蓝汛) 继续阅读

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

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

[code]
#! /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/…/…}
[/code]

Linux dd命令中dsync与fdatasync的区别

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

[code]
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
[/code]

相信上述两个在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的路程。
甲车每次只能走四米,达到四米就得刹车,乙车可以一次性走完一千米。
相信大家也清楚,甲车还没加速到最高速度,就得刹车,走完这一千米需要不少时间。
而乙车,可以一直加速到其所能达到的最大速率,走完这一千米,花的时间明显比甲少。 继续阅读