查看文件內容-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
歡迎轉載,轉載請註明出處