查看文件内容-while:php
cat 1.txt|while read line;do echo $line;donehtml
while read line; do echo $line; done <./1.txtjava
从日志当中测试链接统计状况mysql
while :; do tail -n 100 /app/nginx/web.log |cut -d -f 8|sort|uniq -c;sleep 5;donelinux
统计文件代码行数:ios
find . -type f -name "*.sh" | xargs wc -lnginx
统计sh文件中含有lst字符串并降序排列web
find . -type f -iname "*.sh"| xargs grep -c lst | grep -v ":0$" | sort -t : -k 2 -nr面试
找到当前文件夹下非jpg和JPG文件内容中的ab替换为cdsql
find . -type f -print |grep -v ".*\.\(jpg\|JPG\)" | xargs sed -i "s/ab/cd/g"
if/else:
exist=1;ip=192.168.0.1;port=3306;if [ ${exist} -eq 1 ]; then echo ${ip}:${port};fi
for:
for ip in 192.168.1.{1..255} ;do ping ${ip} -w 1 &> /dev/null && echo ${ip} is Alive;done
for ip in `cat iplist`;do scp config/${ip}.conf $ip:/home/shell/;done
for x in `cat 1.txt`; do echo $x;mkdir dir{0..2}{0..2}_$x; done
for i in `cat iplistr.ip`; do echo $i; ssh $i "supervisorctl start nginx";done
mysql相关:
socket=`ps -ef|grep mysql|grep -v grep|grep sock|awk 'BEGIN{FS = "--"}{for (f=1; f <= NF; f+=1) {if ($f ~ /sock/) {print $f}}}'|awk -F'=' '{print $2}'|grep 3306`;echo $socket
while :; do sleep 1;netstat -lanp|grep 3306|grep ESTABLISHED|awk '{print $5}'|awk -F ':' '{print $1}'|sort|uniq|wc -l|awk 'BEGIN{a="'$(date +%H:%M:%S)'";}{printf "%s,%d\n",a,$1}' >> access_num.log;done
查看系统资源
取进程占用 cpu 最高的前10个进程
ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head
取进程占用内存(MEM)最高的前10个进程
ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head
查找系统占用磁盘最大的前十个文件
du -sk /*|sort -rn|head
排名前5的文件大小
find . -type f -exec ls -l -h {} \; | sort -nr -k 5 | head -n 5
统计超过1年的zip压缩文件的总和
find ./ -name "*.zip" -mtime +365|xargs du -ch
查看CPU及硬盘大小
# 查看CPU型号
grep 'model name' /proc/cpuinfo | head -1 | awk -F":" '{print $2}'
# 查看物理CPU个数
grep 'physical id' /proc/cpuinfo | sort -u | wc -l
# 查看逻辑CPU的个数
grep 'processor' /proc/cpuinfo | sort -u | wc -l
# 查看磁盘大小
fdisk -l | grep 'Disk /dev/xvd' | awk '{print $3}' | awk '{sum+=$1} END {print sum}'
解释
SUM += $1
sum默认初值为0。awk逐行处理,$1为每行的第一个字段,就是计算每行第一个字段的累加和。
END部分是处理完全部行后执行的。
print SUM 即打印最终的累加和
1.CPU
# 查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
# 查看每一个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq
# 查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l
# 查看CPU信息(型号)
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
# 总核数 = 物理CPU个数 X 每颗物理CPU的核数
# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数
二、disk
查看磁盘大小
fdisk -l | grep 'Disk /dev/xvd' | awk '{print $3}' | awk '{sum+=$1} END {print sum}'
三、free -m
centos7查看内存
[root@localhost proc]# free -m
total used free shared buff/cache available
Mem: 977 360 97 7 520 411
Swap: 2047 0 2047
空闲内存total-used=free+buff/cache
咱们经过free命令查看机器空闲内存时,会发现free的值很小。这主要是由于,在linux中有这么一种思想,内存不用白不用,所以它尽量的cache和buffer一些数据,以方便下次使用。但实际上这些内存也是能够马上拿来使用的。
查看系统信息
date;uname -ar;
more /etc/redhat-release;
top -n 1|grep -E 'Tasks|Mem|Swap';
df -kh;
free -m;
netstat -nltp;
cat /proc/net/sockstat;
cat /proc/cpuinfo|grep 'physical id'|sort -n|uniq -c;
cat /proc/cpuinfo|grep -E 'vendor_id|model name|cpu MHz|cache size'|sort -n|uniq -c;
getconf LONG_BIT;
/sbin/ifconfig|grep HWaddr|awk '{print $0,$4,$5}';
/sbin/ifconfig|grep inet|grep -v inet6|grep -v 127.0.0.1;
dmidecode |grep Product
date;uname -ar;more /etc/redhat-release;top -n 1|grep -E 'Tasks|Mem|Swap';df -kh;free -m;netstat -nltp;cat /proc/net/sockstat;cat /proc/cpuinfo|grep 'physical id'|sort -n|uniq -c;cat /proc/cpuinfo|grep -E 'vendor_id|model name|cpu MHz|cache size'|sort -n|uniq -c;getconf LONG_BIT;/sbin/ifconfig|grep HWaddr|awk '{print $0,$4,$5}';/sbin/ifconfig|grep inet|grep -v inet6|grep -v 127.0.0.1;dmidecode |grep Product
iostat查看IO
iostat 3 3
iostat -d -x -k 1 10
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 1.56 28.31 7.84 31.50 43.65 3.16 21.82 1.58 1.19 0.03 0.80 2.61 10.29
sda 1.98 24.75 419.80 6.93 13465.35 253.47 6732.67 126.73 32.15 2.00 4.70 2.00 85.25
sda 3.06 41.84 444.90 54.08 14204.08 2048.98 7102.04 1024.49 32.57 2.10 4.21 1.85 92.24
能够看到磁盘的平均响应时间<5ms,磁盘使用率>80。磁盘响应正常,可是已经很繁忙了。
iostat
iostat -d -k 1 10 #查看TPS和吞吐量信息
iostat -d -x -k 1 10 #查看设备使用率(%util)、响应时间(await)应该低于5ms,若是大于10ms就比较大了。
iostat -c 1 10 #查看cpu状态
Linux iostat监测IO状态 - 翼动动空 的我的空间 - 开源中国社区
http://my.oschina.net/u/2294938/blog/673925
sed
替换
sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
文件5-10行的前面加#号
sed -i "5,10s/^/#/" host_slow.log
查找 00:10:34至00:10:38的日志内容
cat server.out.20160114 |sed -n '/2016-01-13 00:10:34/,/2016-01-13 00:10:38/p'
查看指定时间的日志
sed -n '/2016-01-13 00:10:34/,/2016-01-13 00:10:38/p' server.out.20160114
sed用法,把空格和tab开头的去除掉
sed 's/^[ t]*//g' 等于 sed 's/^[ \t]*//g
例子:grep 'cpu cores' /proc/cpuinfo |uniq |awk -F : '{print $2}' |sed 's/^[ \t]*//g'
find
删除或移动文件
find . -type f -name *.log | xargs rm
find . -type f -name "*.sh" | xargs -i mv {} /home/shell
xargs与find常常结合来进行文件操做,平时删日志的时候只是习惯的去删除,好比
# find . -type f -name "*.log" | xargs rm -rf *
就将以log结尾的文件删除了,若是我想去移动或者复制就须要使用参数来代替了。
find . -type f -name "*.txt" | xargs -i cp {} /tmp/k/
请不要用此方法移动文件夹,会直接删除文件夹
ls -ld phpframe-* -exec mv {} /backup \;
或
ls -ld phpframe-*|xargs mv /backup/
用xargs查询,注意要有|,另此命令是分批处理以前查询的结果
find . -perm 777|xargs ls -l
若是系统磁盘忽然没空间了,查找最近五天内更过的文件
find / -mtime -5
查看更改时间在5天前的文件
find / -mtime +5
根据文件内容来查找相关文件所在位置
find ./ -type f| xargs grep -i 'dataSource'
根据文件修改时间、名字复制到制定目录
find ./ -mtime +120 -name "mysql-bin*"|xargs -n1 -i cp -a {} /home/mysqlbinlog-bak/mysql3306-binlog/
根据文件名后缀,删除文件。例如删除phd的文件
-rw-r--r--. 1 root root 662M Jun 14 10:29 heapdump.20160614.102831.29419.0004.phd
-rw-r--r--. 1 root root 662M Jun 14 10:29 heapdump.20160614.102831.29419.0006.phd
-rw-r--r--. 1 root root 662M Jun 14 10:29 heapdump.20160614.102831.29419.0007.phd
-rw-r--r--. 1 root root 662M Jun 14 10:30 heapdump.20160614.102831.29419.0008.phd
find ./ -iregex ".*\.phd"|xargs rm -rf
grep
查询并输出成功或失败
grep 'SELINUX=enforcing' /etc/selinux/config 2>&1 >/dev/null && print_PASS || print_FAIL
截取TYPE列的信息
blkid /dev/sda1 | awk -F"=" '{print $2}'|awk '{print $2}'
blkid /dev/sda1 | awk -F"=" '{print $2}'|awk '{print $1}'|cut -d"\"" -f2
bb0954a8-3507-4613-b4ee-5c5961c43a36
判断磁盘大小
lsblk | grep sda1 | grep -qs '2.1G' && print_PASS || print_FAIL
变量赋值为一个命令运行的结果
mode=`ls -lh /root/foo.sh | awk '{print $1}'`
查询防火墙服务是否加入防火墙
firewall-cmd --list-all | grep services | grep -qsE ssh && print_PASS || print_FAIL
firewall-cmd --list-all | grep -qsE "rule family=\"ipv4\" source address=\"172.17.10.0/24\" service name=\"ssh\" reject" && print_PASS || print_FAIL
判断服务是否起来
systemctl status httpd &>/dev/null && echo PASS || echo FAIL
查进程并杀掉
ps -ef|grep "/opt/openoffice4/program/soffice"|grep -v grep|grep -v grep|awk '{print $2}' | xargs kill
awk
查找document的selinux标签
documentroot=`grep "DocumentRoot" /etc/httpd/conf.d/vhost-server0.conf | awk '{print $2}' | awk -F\" '{print $2}'`
context=`ls -lZd $documentroot | awk -F: '{print $3}'
查看文件权限
ls -lh /root/foo.sh | awk '{print $1}'
显示以字母t开头的全部用户信息
awk '/^t/{print $1}' /etc/passwd
显示UID大于500的用户信息
awk -F: '$3>=500{print $1,$3}' /etc/passwd
BEGIN/END
BEGIN/END,BEGIN在第一行被读取前执行,END表示在最后一行匹配完再执行
示例1:统计每种shell使用的用户的个数
# awk -F: '{shell[$NF]++}END{for(A in shell){print A,shell[A]}}' /etc/passwd
/bin/sync 1
/bin/bash 10
/sbin/nologin 34
示例2:统计每一个TCP链接状态的个数
# netstat -ant | awk '/^tcp/{STATE[$NF]++}END{for (s in STATE) print s,STATE[s]}'
LISTEN 15
ESTABLISHED 1
示例3:统计日志文件中每一个IP地址的访问量
awk '{counts[$1]++} END{for(ip in counts) print counts[ip],ip}' /var/log/httpd/access_log
cd /usr/local/nginx/logs
awk '{counts[$1]++} END{for(ip in counts) print counts[ip],ip}' access.log |sort -rn|head -n 30
cat access.log|sort|awk '$NF!~/-/ {print $1"," $NF}'|uniq |awk -F , '{print $1}'|uniq -c|sort -nr|head -20
awk能够截取多个字段
dir -l|awk '{print $3,$4,$9}'
awk的NR用法
打印第二行第二项
[root@hchtest2 ~]# free -m | awk 'NR==2 {print $2}'
1878
You have new mail in /var/spool/mail/root
[root@hchtest2 ~]# free -m
total used free shared buffers cached
Mem: 1878 1804 73 0 73 293
-/+ buffers/cache: 1437 441
Swap: 1635 49 1586
打印第二行
cat /etc/issue.net | awk 'NR==1 {print}'
CentOS release 6.5 (Final)
[root@hchtest2 ~]# cat /etc/issue.net
CentOS release 6.5 (Final)
Kernel \r on an \m
查看内存信息
dmidecode|grep -P -A5 "Memory\s+Device"|grep Size
egrep
用egrep查找3项内容memory_limit、post_max_size、upload_max_filesize
cat php.ini|egrep "memory_limit|post_max_size|upload_max_filesize"
memory_limit = 512M
post_max_size = 100M
upload_max_filesize = 100M
查找java进程
ps -ef|grep java|egrep -o "[1-9]{4}"|head -n1
date
设置变量为3天前
[root@hchtest3 ~]# date +%F
2015-11-30
[root@hchtest3 ~]# date +%F -d "-3 days"
2015-11-27
[root@hchtest3 ~]# date +%Y-%m-%d -d "-3 days"
2015-11-27
时间输入
date '+%F %r'
2016-12-12 09:32:07 AM
setfacl
设置目录/javasoft下的全部文件及文件夹都对ljun有读写权限
setfacl -R -m u:ljun:rwx /javasoft/
不加 -R递归,就只在 /javasoft里有权限, /javasoft/123里就没有权限了
setfacl -m u:ljun:rwx /javasoft/
现有一目录是虚拟机和linux共享的,可是每次程序调用新建的文件都发现没有权限。
因而指定特定目录及其子目录下新建的文件或目录对于用户qhfz都有读写执行的权限
-R表示递归 -m表示设置文件acl规则
setfacl -R -m d:u:qhfz:rwx /data2/ResourceCase
setfacl -R -m d:u: ResourceCase:rwx /data2/ResourceCase
--删除ACL规则使用-b
setfacl -R -b /data2/ResourceCase
nmap
nmap
查找网络中全部活跃的主机
$ nmap -sn 10.42.0.0/24
-sn
- 是扫描的类型,这里是 ping 方式扫描。默认上,Nmap 使用端口扫描,可是这种扫描会禁用端口扫描。
10.42.0.0/24
- 是目标网络,用你实际的网络来替换
mount
挂载cifs
mount -t cifs -o username=andy,password=redhat //172.24.6.10/common /haha
cat
eof结束
利用cat输入脚本,eof结束输入
if [ ! -f LNMP+zabbix.repo ]; then
cat> /etc/yum.repos.d/LNMP+zabbix.repo <<'EOF'
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1
EOF
fi
设置变量为一个查询结果命令,并取出结果的某一列
#!/bin/bash
RESULT=$(cd /opt/mqm/bin
su mqm << remotessh
./runmqsc HUFFPMQ
dis qlocal(USKY.HUFFP.RESPONSE4) CURDEPTH;
end
exit
remotessh
)
VARA=$(echo $RESULT |grep -o "CURDEPTH([0-9]\+)"|grep -o "[0-9]\+")
#VARA=$(echo $RESULT | awk "/CURDEPTH\(([0-9]*)/" |grep -o "[0-9]\+")
echo $VARA
# cat << EOF > /tmp/3.txt
> aaaa
> bbbb
> cccc
> dddd
> EOF
建立500M的主分区
# echo -e "n\np\n1\n\n+500M\nw\n" | fdisk /dev/sdb &> /dev/null
\n:自动换行
-n, --number 对输出的全部行编号
-b --number-nonblank 对非空输出行编号
-T, --show-tabs 将跳 字符显示为 ^I
[root@localhost ~]# cat -b /etc/fstab 注:查看/etc/目录下的profile内容,而且对非空白行进行编号,行号从1开始;
[root@localhost ~]# cat -n /etc/profile 注:对/etc目录中的profile的全部的行(包括空白行)进行编号输出显示;
ps
查看僵尸进程
ps -A -o stat,ppid,pid,cmd |grep -e "^[Zz]"
批量删除僵尸进程
ps -A -o stat,ppid,pid,cmd |grep -e "^[Zz]"|awk '{print $2}'|xargs kill -9
ps aux | less
vsz:进程所占用内存的总大小 以kb为单位
rss:进程所占用实际物理内存的大小 以kb为单位
lsof
查看端口是哪一个进程占用
[root@hchtest3 nginx]# lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
haproxy 2200 nobody 4u IPv4 11716 0t0 TCP hchtest3:http (LISTEN)
top
load average: 0.01, 0.03, 0.05
cpu在1分钟、5分钟、15分钟的平均负载值
平均负载值/cpu个数
大于1:cpu资源饱和
小于1:cpu使用正常
查看cpu个数:
# grep "model name" /proc/cpuinfo
model name : Intel(R) Core(TM) i5-2450M CPU @ 2.50GHz
# grep "model name" /proc/cpuinfo | wc -l
1
top命令进程排序显示
M:按内存占用百分比
P:按CPU占用百分比
T:按进程运行时间
set显示环境变量
sar
查看CPU状况
sar 5 5
sar(System Activity Reporter系统活动状况报告)是目前 Linux 上最为全面的系统性能分析工具之一,能够从多方面对系统的活动进行报告,包括:文件的读写状况、系统调用的使用状况、磁盘I/O、CPU效率、内存使用情况、进程活动及IPC有关的活动等。
输出项说明:
CPU:all 表示统计信息为全部 CPU 的平均值。
%user:显示在用户级别(application)运行使用 CPU 总时间的百分比。
%nice:显示在用户级别,用于nice操做,所占用 CPU 总时间的百分比。
%system:在核心级别(kernel)运行所使用 CPU 总时间的百分比。
%iowait:显示用于等待I/O操做占用 CPU 总时间的百分比。
%steal:管理程序(hypervisor)为另外一个虚拟进程提供服务而等待虚拟 CPU 的百分比。
%idle:显示 CPU 空闲时间占用 CPU 总时间的百分比。
1. 若 %iowait 的值太高,表示硬盘存在I/O瓶颈
2. 若 %idle 的值高但系统响应慢时,有多是 CPU 等待分配内存,此时应加大内存容量
3. 若 %idle 的值持续低于1,则系统的 CPU 处理能力相对较低,代表系统中最须要解决的资源是 CPU 。
要判断系统瓶颈问题,有时需几个 sar 命令选项结合起来
怀疑CPU存在瓶颈,可用 sar -u 和 sar -q 等来查看
怀疑内存存在瓶颈,可用 sar -B、sar -r 和 sar -W 等来查看
怀疑I/O存在瓶颈,可用 sar -b、sar -u 和 sar -d 等来查看
linux sar 命令详解 - Cai's - 开源中国社区
http://my.oschina.net/caiyuan/blog/119012
CPU使用状况
sar -u -o 60 5
在全部的显示中,咱们应主要注意%wio和%idle,%wio的值太高,表示硬盘存在I/O瓶颈,%idle值高,表示CPU较空闲,若是%idle值高但系统响应慢时,有多是CPU等待分配内存, 此时应加大内存容量。%idle值若是持续低于10,那么系统的CPU处理能力相对较低,代表系统中最须要解决的资源是CPU。
磁盘使用状况
sar -d 5 3
怀疑CPU存在瓶颈,可用sar -u 和sar -q来看,怀疑I/O存在瓶颈,可用sar -b、sar -u和sar-d来看
sar详解(linux/unix通用) | 旺旺知识库
http://www.toxingwang.com/linux-unix/2027.html
SAR 命令详解-dbconf-ChinaUnix博客
http://blog.chinaunix.net/uid-23177306-id-2531032.html
sar命令--Linux 性能分析 - richard_2010 - ITeye技术网站
http://richard-2010.iteye.com/blog/1271044
uniq
uniq -c删除重复值
netstat -an|grep 8080 |grep FIN_WAIT2| grep -E '::ffff:'| awk -F: '{print $8}'|sort -n|uniq -c
寻找会员号,并把重复次数倒序排列出来
cat server.out.20160216 |grep "HUBTM LOGIN"|grep member_id|awk -F',' '{print $2}'|awk -F'=' '{print $2}'|sort | uniq -c | sort -k1,1nr | head -10
sort
指令各部分的功能:
sort: 对单词进行排序
uniq -c: 显示惟一的行,并在每行行首加上本行在文件中出现的次数
sort -k1,1nr: 按照第一个字段,数值排序,且为逆序
head -10: 取前10行数据
iptables防火墙策略
service iptables save
//将规则保存在/etc/sysconfig/iptables文件里
查看防火墙策略
iptables -L -n --line-number
iptables -vnL
service iptables status
查看防火墙nat策略
iptables -L -t nat
删除INPUT的第24条策略
iptables -D INPUT 24
-I插入策略放到最上面(加入防火墙策略使用这个)
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 8097 -j ACCEPT
-A增长一条规则到最后
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 8097 -j ACCEPT
-D删除策略
iptables -D INPUT -p tcp -m state --state NEW -m tcp --dport 8017 -j ACCEPT
ifconfig
临时绑定IP
ifconfig eth0:0 10.72.32.185 netmask 255.255.255.0
eth0绑定网卡
/sbin/ip addr add "10.70.72.126/24" dev eth0
删除临时IP
/sbin/ip addr del "10.70.72.126/24" dev eth0
netstat
Linux 经常使用netstat命令 实例讲解
这是一个十分经常使用的命令,可让你实时了解到云主机当前的状态,例如:常见的80链接数量,以及按一些排序,来检查是否被攻击?查看time_wait和syn链接数量等等。
1.查看全部80端口的链接数
netstat -nat|grep -i "80"|wc -l
2.对链接的IP按链接数量进行排序
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
3.查看TCP链接状态
netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn
netstat -n | awk '/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}'
netstat -n | awk '/^tcp/ {++state[$NF]}; END {for(key in state) print key,"\t",state[key]}'
netstat -n | awk '/^tcp/ {++arr[$NF]};END {for(k in arr) print k,"\t",arr[k]}'
netstat -n |awk '/^tcp/ {print $NF}'|sort|uniq -c|sort -rn
netstat -ant | awk '{print $NF}' | grep -v '[a-z]' | sort | uniq -c
4.查看80端口链接数最多的20个IP
netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20
netstat -ant |awk '/:80/{split($5,ip,":");++A[ip[1]]}END{for(i in A) print A,i}' |sort -rn|head -n20
5.用tcpdump嗅探80端口的访问看看谁最高
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -20
6.查找较多time_wait链接
netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n20
7.找查较多的SYN链接
netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more
tar
不解压查看压缩文件内容
tar tvf apache-tomcat-8.0.36.tar.gz
gzip、gunzip
Linux压缩保留源文件的方法:
gzip –c filename > filename.gz
Linux解压缩保留源文件的方法:
gunzip –c filename.gz > filename
设置环境变量
echo "export JAVA_HOME=/usr/local/jdk1.7.0_15" >>~/.bashrc
. ~/.bashrc
echo $JAVA_HOME
-a 和 &&的区别
注意-a 和 &&的区别,-a用[]里,&&均可以
[root@hchtest3 ~]# if [[ -f /root/while.sh || -f /root/pid.sh ]];then echo exist;fi
exist
[root@hchtest3 ~]# if [[ -f /root/while.sh -a -f /root/pid.sh ]];then echo exist;fi
-bash: syntax error in conditional expression
-bash: syntax error near `-a'
[root@hchtest3 ~]# if [ -f /root/while.sh -a -f /root/pid.sh ];then echo exist;fi
exist
ls
ls -F -R /etc/
层级显示目录下文件、及文件夹
ansible经常使用命令
ansible -i hosts all -m ping -f 20 --output=result
-m 指明要使用的模块名,这里使用ping模块来测试ansible是否可达列表中额主机
-f 指明线程数,默认5个并发。
--output 指明输出文件,不指定的话输出到控制台。
在远程主机执行脚本
ansible -i hosts all -m script -a 'mha_stop.sh'
#在远程主机执行shell命令(与command模块的区别是支持管道和重定向)
ansible -i hosts all -m shell -a " cat /tmp/authorized_keys >> /root/.ssh/authorized_keys"
#往远程主机拷贝文件
ansible -i hosts all -m copy -a "src=/etc/hosts dest=/tmp/hosts mode=600 owner=mdehaan group=mdehaan"
#从远程主机拉取文件
ansible -i hosts all -m fetch -a "src=/etc/hosts dest=/tmp/hosts mode=600 owner=mdehaan group=mdehaan"
#更改远程文件属性
ansible -i hosts all -m file -a "dest=/srv/foo/a.txt mode=600"
ansible -i hosts all -m file -a "dest=/srv/foo/b.txt mode=600 owner=mdehaan group=mdehaan"
ansible -i hosts all -m file -a "dest=/path/to/c mode=755 owner=mdehaan group=mdehaan state=directory"
ansible -i hosts all -m file -a "dest=/path/to/c state=absent"
#在远程助主机安装/删除/更新包
ansible -i hosts all -m yum -a "name=java-1.8.0-openjdk.x86_64 state=present"
ansible -i hosts all -m yum -a "name=java-1.8.0-openjdk.x86_64 state=absent"
ansible -i hosts all -m yum -a "name=java-1.8.0-openjdk.x86_64 state=latest"
#在远程主机启/停服务
ansible -i hosts all -f 50 -m service -a "name=filebeat state=started"
ansible -i hosts all -f 50 -m service -a "name=filebeat state=restarted"
ansible -i hosts all -f 50 -m service -a "name=filebeat state=stopped"
#在远程主机部署/删除cron任务
ansible -i hosts all -m cron -a 'name="a job for reboot" special_time=reboot job="/some/job.sh"'
ansible -i hosts all -m cron -a 'backup="True" name="test" minute="0" hour="2" job="ls -alh > /dev/null"'
ansible -i hosts all -m cron -a 'name="test" state=absent'
linux open file修改
vi /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
从新登录便可,但可能对如今已启动服务不生效
ulimit -a查看一下
Linux内核参数调整
因为默认的linux内核参数考虑的是最通用场景,这明显不符合用于支持高并发访问的Web服务器的定义,因此须要修改Linux内核参数,让Nginx能够拥有更高的性能;
在优化内核时,能够作的事情不少,不过,咱们一般会根据业务特色来进行调整,当Nginx做为静态web内容服务器、反向代理或者提供压缩服务器的服务器时,期内核参数的调整都是不一样的,这里针对最通用的、使Nginx支持更多并发请求的TCP网络参数作简单的配置
修改 /etc/sysctl.conf 来更改内核参数
fs.file-max = 999999
#表示单个进程最大能够打开的句柄数;
net.ipv4.tcp_tw_reuse = 1
#参数设置为 1 ,表示容许将TIME_WAIT状态的socket从新用于新的TCP连接,这对于服务器来讲意义重大,由于总有大量TIME_WAIT状态的连接存在;
ner.ipv4.tcp_keepalive_time = 600
#当keepalive启动时,TCP发送keepalive消息的频度;默认是2小时,将其设置为10分钟,能够更快的清理无效连接。
net.ipv4.tcp_fin_timeout = 30
#当服务器主动关闭连接时,socket保持在FIN_WAIT_2状态的最大时间
net.ipv4.tcp_max_tw_buckets = 5000
#这个参数表示操做系统容许TIME_WAIT套接字数量的最大值,若是超过这个数字,TIME_WAIT套接字将马上被清除并打印警告信息。
#该参数默认为180000,过多的TIME_WAIT套接字会使Web服务器变慢。
net.ipv4.ip_local_port_range = 1024 65000
#定义UDP和TCP连接的本地端口的取值范围。
net.ipv4.tcp_rmem = 10240 87380 12582912
#定义了TCP接受缓存的最小值、默认值、最大值。
net.ipv4.tcp_wmem = 10240 87380 12582912
#定义TCP发送缓存的最小值、默认值、最大值。
net.core.netdev_max_backlog = 8096
#当网卡接收数据包的速度大于内核处理速度时,会有一个列队保存这些数据包。这个参数表示该列队的最大值。
net.core.rmem_default = 6291456
#表示内核套接字接受缓存区默认大小。
net.core.wmem_default = 6291456
#表示内核套接字发送缓存区默认大小。
net.core.rmem_max = 12582912
#表示内核套接字接受缓存区最大大小。
net.core.wmem_max = 12582912
#表示内核套接字发送缓存区最大大小。
注意:以上的四个参数,须要根据业务逻辑和实际的硬件成原本综合考虑;
net.ipv4.tcp_syncookies = 1
#与性能无关。用于解决TCP的SYN攻击。
net.ipv4.tcp_max_syn_backlog = 8192
#这个参数表示TCP三次握手创建阶段接受SYN请求列队的最大长度,默认1024,将其设置的大一些可使出现Nginx繁忙来不及accept新链接的状况时,Linux不至于丢失客户端发起的连接请求。
net.ipv4.tcp_tw_recycle = 1
#这个参数用于设置启用timewait快速回收。
net.core.somaxconn=262114
# 选项默认值是128,这个参数用于调节系统同时发起的TCP链接数,在高并发的请求中,默认的值可能会致使连接超时或者重传,所以须要结合高并发请求数来调节此值。
net.ipv4.tcp_max_orphans=262114
#选项用于设定系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。若是超过这个数字,孤立连接将当即被复位并输出警告信息。这个限制指示为了防止简单的DOS攻击,不用过度依靠这个限制甚至认为的减少这个值,更多的状况是增长这个值。
生效配置
---下方不带注释的能够直接复制
fs.file-max = 999999
net.ipv4.tcp_tw_reuse = 1
ner.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_rmem = 10240 87380 12582912
net.ipv4.tcp_wmem = 10240 87380 12582912
net.core.netdev_max_backlog = 8096
net.core.rmem_default = 6291456
net.core.wmem_default = 6291456
net.core.rmem_max = 12582912
net.core.wmem_max = 12582912
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_tw_recycle = 1
net.core.somaxconn=262114
net.ipv4.tcp_max_orphans=262114
修改好配置文件,执行 sysctl -p 命令,使配置当即生效
注意事项
1)开头加解释器:#!/bin/bash
2)语法缩进,使用四个空格;多加注释说明。
3)命名建议规则:变量名大写、局部变量小写,函数名小写,名字体现出实际做用。
4)默认变量是全局的,在函数中变量local指定为局部变量,避免污染其余做用域。
5)有两个命令能帮助我调试脚本:set -e 遇到执行非0时退出脚本,set-x 打印执行过程。
6)写脚本必定先测试再到生产上。
1 获取随机字符串或数字
获取随机8位字符串:
获取随机8位数字:
cksum:打印CRC效验和统计字节
2 定义一个颜色输出字符串函数
function关键字定义一个函数,可加或不加。
3 批量建立用户
4 检查软件包是否安装
5 检查服务状态
6 检查主机存活状态
方法1: 将错误IP放到数组里面判断是否ping失败三次
方法2: 将错误次数放到FAIL_COUNT变量里面判断是否ping失败三次
方法3: 利用for循环将ping通就跳出循环继续,若是不跳出就会走到打印ping失败
7 监控CPU、内存和硬盘利用率
1)CPU
借助vmstat工具来分析CPU统计信息。
2)内存
3)硬盘
8 批量主机磁盘利用率监控
前提监控端和被监控端SSH免交互登陆或者密钥登陆。
写一个配置文件保存被监控主机SSH链接信息,文件内容格式:IP User Port
9 检查网站可用性
1)检查URL可用性
2)判断三次URL可用性
思路与上面检查主机存活状态同样。
本章写的Shell脚本例子都比较实用,在面试题中也常常出现,但愿你们参考着多动手写写,不要复制粘贴就拿来跑,这样是学不会的!
时间格式转换
[root@hchtest-ansible ~]# date -d "1 days ago" +%Y.%m.%d
2019.03.18
[root@hchtest-ansible ~]# date -d "1 days ago" +%Y-%m-%d
2019-03-18
统计某些文件大小总和
ls -l *.2019-03-16*.tar.gz|awk '{sum += $5};END{print sum/1024/1024/1024}'
Linux只读帐号配置
整个配置的命令以下(主要使用了:Linux bash受限的shell(RESTRICTED SHELL))
步骤
#1.建立只读shell(这步能够省略)
ln -s /bin/bash /bin/rbash
#2.建立用户并指定用户启动执行的shell
useradd -s /bin/bash readonly
这步不要指定rbash,否侧cd等內建命令没法使用
#3.修改用户密码
#4.建立用户shell执行命令目录
mkdir /home/readonly/.bin
#5.root修改用户的shell配置文件
chown root. /home/readonly/.bash_profile chmod 755 /home/readonly/.bash_profile
并设置文件不可删除权限
chattr -i /home/readonly/.bash_profil
#6.修改bash配置文件,主要是指定PATH的读取
vi /home/readonly/.bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs
#PATH=$PATH:$HOME/bin
PATH=$HOME/.bin
export PATH
#切换到只读帐号使环境变量生效
su - readonly
source /home/readonly/.bash_profile
#7.将容许执行的命令连接到$HOME/.bin目录
ln -s /usr/bin/wc /home/readonly/.bin/wc ln -s /usr/bin/tail /home/readonly/.bin/tail ln -s /bin/more /home/readonly/.bin/more ln -s /bin/cat /home/readonly/.bin/cat ln -s /bin/grep /home/readonly/.bin/grep ln -s /bin/find /home/readonly/.bin/find ln -s /bin/pwd /home/readonly/.bin/pwd ln -s /bin/ls /home/readonly/.bin/ls ln -s /bin/less /home/readonly/.bin/less ln -s /bin/tar /home/readonly/.bin/tar
Linux 显示隐藏目录或隐藏文件的占用空间
du -sh .[!.]* * | sort -hr
判断文件是否更新
md5sum /usr/local/nginx/conf/blockip.conf > /root/blockip_md5_after
before=$(awk '{print $1}' /root/blockip_md5_before)
after=$(awk '{print $1}' /root/blockip_md5_after)
if [[ $before == $after ]];then
echo 'blockip.conf is not changed'
else
echo 'blockip.conf has been changed'
/etc/init.d/nginx reload
fi
欢迎转载,转载请注明出处