很多时候项目出现的问题不是代码的问题,是运维的问题,下面是日常工作排查机器问题的常用命令
前言
linux 运维监控包括很多维度: 磁盘,io,网络,负载,端口监控,日志记录 等等
“总而言之,万物皆文件就是Linux”
磁盘监控
df -lh
du -sh /data/*
删除线上日志
- true > INFO-
- true > ERROR-
cpu监控
top
htop
进程监控
jps
ps -ef | grep
端口监控
netstat -antlp | grep -i 9000
最大文件数
file
ip设置与查看
ifconfig
cat /etc/hosts
内存监控
free -m
io监控
iostat -d 磁盘
文件压缩
- 压缩:
tar -czvf my.tar file1 file2,...
- 解压缩到当前目录:
tar xzvf my.tar ...
- 编写service.run文件,放到usr/lib/systemd/system/下并授权即可
历史记录查看
history | grep
-> 只能查看所登录用户的历史记录
文件查找
find -name xxx /
locate xxx
-> dbupdate
网络io
iftop
- 不加-B是带宽 bit,加-B是网速 bytes
iftop -F 203.119.169.0/24 -B
大文件查看
之前再用vim打开大约4G的日志文件的时候,发现使用vim查看大日志会占用很多内存,并把线上服务给挤下去
并且有一次因为日志设置的不合理,一天的日志大小达到了200多G(zk链接不上,报错触发的日志错误)
tail -n 100 xxx
head -n 100 xxx
tail -f xxx
用户权限
sudo su root
delgroup
add user
top/htop/ps命令的由来
/proc/$pid/xxx
$pid
ppid
跨服务器操作
scp [user@]host1:]file1 ... [[user@]host2:]file2
ssh $user@$host "source /etc/profile;command"
使用脚本对多台服务器进行命令操作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| #!/bin/bash
# 快捷操作脚本
#
# 在除kafka01 kafka02这两台机器上执行创建文件夹的命令
# ./control.sh "mkdir /data/log/control" "kafka01 kafka02"
# 集群内复制文件
# ./control.sh "scp kafka01:/data/log/control/a.sh $PWD"
#
# $1 需要执行的命令 注意使用双引号
# $2 需要排除的机器 注意使用双引号
user="hadoop"
for host in hadoop01 hadoop02 hadoop03 hadoop04 hadoop05 hadoop06 hadoop07 hadoop08 hadoop09 hadoop10
do
if [[ $2 =~ $host ]]; then
echo "Skip the machine $host"
else
echo "Handling... ${host} [ $1 ]"
ssh $user@$host "source /etc/profile;${1}"
fi
done
https://blog.csdn.net/wodeyuer125/article/details/51918408
|
scp实现一个文件 多机器多源 复制脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
| #!/bin/sh
print_usage()
{
echo "语法一,以相同的用户名、目标名称复制文件: bscp -ut[r] sourceDir user targetDir host1 host2…"
echo "语法二,以相同的用户名、不同的目标名称复制文件: bscp -u[r] sourceDir user host1:targetDir1 host2:target2…"
echo "语法三,不同的用户名、相同的目标名称复制文件: bscp -t[r] sourceDir targetDir user1@host1 user2@host2…"
echo "语法四,用户名、目标名称均不同: bscp [-r] sourceDir user1@host1:targetDir1 user2@host2:targetDir2…"
}
argNumber=$#
# 如果没有参数则打印使用方法
if [ $argNumber -le 1 ]; then
print_usage
exit 1
fi
COMMAND=$1
#shift
case $COMMAND in
(--help|-help|-h|help)
print_usage
exit 0
;;
esac
if [ "${COMMAND:0:1}" != "-" ];then
shift
args="$@"
for i in $args
do
scp $COMMAND $i
done
else
length=${#COMMAND}
#echo $length
if [ $length -eq 4 ]; then
shift
if [ $# -le 3 ];then
print_usage
exit 1
fi
source=$1
targetUser=$2
targetDir=$3
shift 3
args="$@"
for i in $args
do
scp -r $source $targetUser@$i:$targetDir
#echo $targetUser
done
elif [ $length -eq 3 ]; then
shift
source=$1
if [ `expr index "$COMMAND" r` -eq 0 ]; then
if [ $# -le 3 ]; then
print_usage
exit 1
fi
targetUser=$2
targetDir=$3
shift 3
args="$@"
for i in $args
do
scp $source $targetUser@$i:$targetDir
done
else
if [ `expr index "$COMMAND" u` -gt 0 ]; then
if [ $# -le 2 ]; then
print_usage
exit 1
fi
targetUser=$2
shift 2
args="$@"
for i in $args
do
scp -r $source $targetUser@$i
done
elif [ `expr index "$COMMAND" t` -gt 0 ]; then
if [ $# -le 2 ]; then
print_usage
exit 1
fi
targetDir=$2
shift 2
args="$@"
for i in $args
do
scp -r $source $i:$targetDir
done
else
print_usage
exit 1
fi
fi
elif [ $length -eq 2 ]; then
shift
source=$1
if [ `expr index "$COMMAND" u` -gt 0 ]; then
if [ $# -le 2 ]; then
print_usage
exit 1
fi
targetUser=$2
shift 2
args="$@"
for i in $args
do
scp $source $targetUser@$i
done
elif [ `expr index "$COMMAND" t` -gt 0 ]; then
if [ $# -le 2 ]; then
print_usage
exit 1
fi
targetDir=$2
shift 2
args="$@"
for i in $args
do
scp $source $i:$targetDir
done
elif [ `expr index "$COMMAND" r` -gt 0 ]; then
if [ $# -le 1 ]; then
print_usage
exit 1
fi
shift 1
args="$@"
for i in $args
do
scp -r $source $i
done
else
print_usage
exit 1
fi
else
print_usage
exit 1
fi
fi
|
日志批量删除脚本(微服务为例)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| #!/bin/bash
find /data/bin/micro_service/log/GateWay/**/ -mtime +1 -name "*.log" -exec echo {} > /logname.txt \;
find /data/bin/micro_service/log/EurekaServer/**/ -mtime +1 -name "*.log" -exec echo {} > /logname.txt \;
find /data/bin/micro_service/log/BranchGetWay/**/ -mtime +1 -name "*.log" -exec echo {} > /logname.txt \;
find /data/bin/micro_service/service/ -name "branchgetway.log" -exec echo {} >> /logname.txt \;
find /data/bin/micro_service/service/ -name "eurekaserver.log" -exec echo {} >> /logname.txt \;
find /data/bin/micro_service/service/ -name "gateway.log" -exec echo {} >> /logname.txt \;
find /data/bin/micro_service/service/ -name "securityserver.log" -exec echo {} >> /logname.txt \;
find /data/bin/micro_service/service/ -name "nohup.out" -exec echo {} >> /logname.txt \;
for logfile in `cat /logname.txt`
do
echo $logfile
true > $logfile
done
|
当文件大小大于85%时,删除日志,写入定时任务中,3h检测一次
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| #!/usr/bin/env bash
#usage:clean disk
#time:2020-01-13
limit=85
function is_overusage(){
usedrate=$(df -hl | grep /data | awk '{print $5}'|awk -F "%" '{print $1}')
echo $usedrate
if [ $usedrate -gt $limit ]
then
return 1
else
return 0
fi
}
function clean_logs(){
find /data/log/**/INFO/ -mtime +12 -name "*.log" -exec echo {} > /data/log/logname.txt \;
find /data/log/**/WARN/ -mtime +12 -name "*.log" -exec echo {} >> /data/log/logname.txt \;
find /data/log/**/**/{INFO,WARN} -mtime +12 -name "*.log" -exec echo {} >> /data/log/logname.txt \;
sed -i '/ReportPlatform/d' /data/log/logname.txt
find /data/log/ReportPlatform/ReportPlatform-172.16.6.122/INFO/ -mtime +60 -name "*.log" -exec echo {} >> /data/log/logname.txt \;
for logfile in `cat /data/log/logname.txt`
do
# echo $logfile
true > $logfile
done
}
is_overusage
if [ $? -eq 1 ]
then
clean_logs
# echo "over"
fi
|
脚本开机启动
方法1.使用 /etc/rc.d/rc.local,自动启动脚本
1
2
| # 例子
touch /var/lock/subsys/local
|
- 授予 /etc/rc.d/rc.local 文件执行权限
命令:chmod +x /etc/rc.d/rc.local
- 在文件文件底部添加脚本
- 重启服务器,查看脚本是否启动
注意:/etc/rc.d/rc.local脚本执行,在/etc/profile之前,若/etc/rc.d/rc.local用到/etc/profile的环境变量,Shell无法执行成功
方法2.注册服务