Linux常见问题合集
Linux基本指令
-
连接SSH
- ssh uesrname@ip
- 例如:
ssh root@192.168.43.217
-
Linux 创建多级目录命令: mkdir -p
- 示例:
mkdir -p project/App;
- 注:删除多级文件夹:
rm -r 文件夹名
-- 表示循环删除文件夹,深入后逐个询问并删除rm -rf 文件夹名
-- f表示强制执行,-rf直接删除,不询问。
- 示例:
-
管道"|":
- 管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。
- 连续使用管道意味着第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。
-
linux基本指令 awk、find、grep
- AWK是一种处理文本文件的语言,是一个强大的文本分析工具
- grep更适合单纯的查找或匹配文本;awk 更适合格式化文本,对文本进行较复杂格式处理
- grep查找具体的文本,find查找文件。
-
grep:-v 不显示匹配上的内容;-n 显示匹配上的内容
- grep -v down,显示不包含down的内容。
- grep -n down,显示包含down的内容。
-
linux命令:找出关键字出现的次数
- 两种方法:grep+wc;awk。
- grep+wc:
- 当个字符串:
grep 字符串 文件名|wc -l
,grep输出,wc -l按行统计 - 多个字符串:
grep 'objStr1\|objStr2' filename|wc -l
- 当个字符串:
- awk:
- 语法1:
awk -v RS="@#$j" '{print gsub(/targetStr/,"&")}' filename
- 语法2:
awk '{s+=gsub(/targetStr/,"&")}END{print s}' filename
- 语法1:
- 统计文件夹下特定类型文件个数
- 示例:统计文件夹下/mount/taskdata 以.log结尾的文件数量
- 法1:
find /mount/taskdata -name *.log |wc -l
-- find查找特定类型并统计 - 法2:
ls /mount/taskdata/*.log |wc -l
-- ls列出特定类型并统计
-
大文件中查找关键字出现的次数
-
查找文件:
- find /(查找范围) -name 查找关键字 -print
- find <指定目录> <指定条件> <指定动作>
- find的使用实例:
-find . -name 'my*'
:搜索当前目录(含子目录,以下同)中,所有文件名以my开头的文件。
-find . -name 'my*' -ls
: 搜索当前目录中,所有文件名以my开头的文件,并显示它们的详细信息。
-find . -type f -mmin -10
: 搜索当前目录中,所有过去10分钟中更新过的普通文件。- 如果不加-type f参数,则搜索普通文件+特殊文件+目录。
- find 可以与 wc 通过管道连接,进行一些统计操作。
-
shell脚本:如何查找出现频率最高的100个ip地址
- 通过查看日志access_log文件进行统计:
- cat access_log |cut -d ' ' -f 1 | sort |uniq -c | sort -nr | awk '{print $0 }' | head -n 100 | less
- 当前WEB服务器中联接次数最多的ip地址:
- netstat -ntu | tail -n +3|awk '{ print $5}' | cut -d : -f 1 | sort | uniq -c| sort -n -r | head -n 100
- 通过文件test.txt查询:
- cat test.txt | awk '{print $2}' | sort | uniq -c | sort -n -r | head -n 100
- 通过查看日志access_log文件进行统计:
-
shell:统计一个文件中重复的行和重复次数
- 格式:uniq [options][file1 [files]]
- uniq -c file:file中的重复行输出一次,并在每行前显示重复次数
- uniq -d file:file中的重复行输出一次,但不输出唯一的行
- uniq -u file:只输出file中的唯一行
- uniq file1 file2:把file1中的重复的相邻行删除,并把每行的一个拷贝送到file2
- 示例:
cat a.txt|uniq -c
和uniq -c a.txt
获得相同结果- 注:只获取重复行,用
unqi -d
的参数d
- 注:只获取重复行,用
-
awk
- 待续
-
查看端口
- netstat -tunlp 是查看所有的在使用的端口号情况
- netstat -tunlp | grep 端口号 是查看所查询的端口号情况
- 参数备注:
- -t:(tcp)仅显示TCP相关端口
- -u:(udp)仅显示UDP相关端口
- -n:不进行DNS轮询,显示IP(可以加速操作)
- -l:仅列出有在Listen(监听)的服务端口
- -p:显示建立相关链接的程序名
-
找到共用80端口的线程
- 注:存疑,先这样吧。
- ps:使用场景:两个不同端口的微服务,当我们测试的时候,需要放到同一台服务器上,共享80端口访问
- ps -ef |grep 80
- netstat -anp |grep :80
-
查看进程
- ps -A 显示所有进程信息
- ps -u root 显示指定用户信息
- ps -ef 显示所有进程信息,连同命令行
- ps -ef|grep ssh 查找特定进程ssh
- ps -l 列出与本次登录有关的进程信息;
- ps -aux 查询内存中进程信息;
- ps -aux |more 分页显示结果
- ps -aux | grep *** 查询***进程的详细信息;
- ps -aux > ps001.txt 把所有进程显示出来,并输出到指定文件中
- ps -o pid,ppid,pgrp,session,tpgid,comm 输出指定字段
- top 查看内存中进程的动态信息;
- kill -9 pid 杀死进程。
-
vim 显示所有行的行号:
:set number
- 操作:esc + 冒号 + set number + 回车
- 显示行号:
:set number
,可以简写为::set nu
- 关闭行号:
:set nonumber
,简写为::set nonu
-
linux 如何将文件从一台服务器转移到另一台服务器
- scp:secure copy的缩写, 是linux系统下基于ssh登陆进行安全的远程文件拷贝命令,可以在linux服务器之间复制文件和目录。
- 格式:scp [参数] [原路径] [目标路径]
- 从本地服务器复制到远程服务器:
- 复制文件: scp local_file remote_username@remote_ip:remote_folder
- 复制目录: scp -r local_folder remote_username@remote_ip:remote_folder
- 参数 -r :递归复制整个目录
-
权限修改命令
- 格式:
chmod ABC Filename
- chmod: 修改文件权限命令。
- rwx:4读取,2写入,1执行,
- User、Group、及Other的权限,同组用户的权限,其他用户的权限。
- 格式:
chmod u+r test.txt //增加用户可读
chmod u-w test.txt //撤销用户可写
chmod u=rw test.txt //重置用户权限(可读可写)
chmod u=- test.txt //重置用户权限(无任何权限)
chmod g=rw test.txt //重置用户组权限(可读可写)
//角色:
u (user)用户(文件所有者)
g (group)用户组(同一组中除了当前用户的其他用户)
o (other)其他用户(其他用户组下的所有用户)
a (all)所有用户
//操作符:
+ 增加权限
- 撤销权限
= 设置权限
//权限值:
r 可读,权限值4
w 可写,权限值2
x 可执行,权限值1
- 无任何权限,权限值0
-
ps -ef | grep xxxserver | grep -v grep|wc -l
- ps -ef 指令用来查询所有进程,grep通过管道来过滤。grep -v 是反向查询的意思,grep -v grep的作用是除去包含grep的项。
-
磁盘查询:
- du:(disk use)显示每个文件和目录的磁盘使用空间。
- df:(disk free)显示磁盘分区上可以使用的磁盘空间。
一、CPU
1、良好状态指标
- CPU利用率:User Time <= 70%,System Time <= 35%,User Time + System Time <= 70%。
- 上下文切换:与CPU利用率相关联,如果CPU利用率状态良好,大量的上下文切换也是可以接受的。
- 可运行队列:每个处理器的可运行队列<=3个线程。
2、监控工具
- vmstat
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
14 0 140 2904316 341912 3952308 0 0 0 460 1106 9593 36 64 1 0 0
17 0 140 2903492 341912 3951780 0 0 0 0 1037 9614 35 65 1 0 0
20 0 140 2902016 341912 3952000 0 0 0 0 1046 9739 35 64 1 0 0
17 0 140 2903904 341912 3951888 0 0 0 76 1044 9879 37 63 0 0 0
16 0 140 2904580 341912 3952108 0 0 0 0 1055 9808 34 65 1 0 0
重要参数:
r,run queue,可运行队列的线程数,这些线程都是可运行状态,只不过CPU暂时不可用;
b,被blocked的进程数,正在等待IO请求;
in,interrupts,被处理过的中断数
cs,context switch,系统上正在做上下文切换的数目
us,用户占用CPU的百分比
sys,内核和中断占用CPU的百分比
id,CPU完全空闲的百分比
上例可得:
sy高us低,以及高频度的上下文切换(cs),说明应用程序进行了大量的系统调用;
这台4核机器的r应该在12个以内,现在r在14个线程以上,此时CPU负荷很重。
- 查看某个进程占用的CPU资源
$ while :; do ps -eo pid,ni,pri,pcpu,psr,comm | grep 'test_command'; sleep 1; done
PID NI PRI %CPU PSR COMMAND
28577 0 23 0.0 0 test_command
28578 0 23 0.0 3 test_command
28579 0 23 0.0 2 test_command
28581 0 23 0.0 2 test_command
28582 0 23 0.0 3 test_command
28659 0 23 0.0 0 test_command
……
二、Memory
1、良好状态指标
- swap in (si) == 0,swap out (so) == 0
- 应用程序可用内存/系统物理内存 <= 70%
2、监控工具
- vmstat
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 3 252696 2432 268 7148 3604 2368 3608 2372 288 288 0 0 21 78 1
0 2 253484 2216 228 7104 5368 2976 5372 3036 930 519 0 0 0 100 0
0 1 259252 2616 128 6148 19784 18712 19784 18712 3821 1853 0 1 3 95 1
1 2 260008 2188 144 6824 11824 2584 12664 2584 1347 1174 14 0 0 86 0
2 1 262140 2964 128 5852 24912 17304 24952 17304 4737 2341 86 10 0 0 4
重要参数:
swpd,已使用的 SWAP 空间大小,KB 为单位;
free,可用的物理内存大小,KB 为单位;
buff,物理内存用来缓存读写操作的buffer大小,KB 为单位;
cache,物理内存用来缓存进程地址空间的 cache 大小,KB 为单位;
si,数据从 SWAP 读取到 RAM(swap in)的大小,KB 为单位;
so,数据从 RAM 写到 SWAP(swap out)的大小,KB 为单位。
上例可得:
物理可用内存 free 基本没什么显著变化,swapd逐步增加,说明最小可用的内存始终保持在 256MB(物理内存大小) * 10% = 2.56MB 左右,当脏页达到10%的时候就开始大量使用swap。
- free
$ free -m
total used free shared buffers cached
Mem: 8111 7185 926 0 243 6299
-/+ buffers/cache: 643 7468
Swap: 8189 0 8189
三、磁盘IO
1、良好状态指标
- iowait % < 20%
提高命中率的一个简单方式就是增大文件缓存区面积,缓存区越大预存的页面就越多,命中率也越高。
Linux 内核希望能尽可能产生次缺页中断(从文件缓存区读),并且能尽可能避免主缺页中断(从硬盘读),这样随着次缺页中断的增多,文件缓存区也逐步增大,直到系统只有少量可用物理内存的时候 Linux 才开始释放一些不用的页。
2、监控工具
- 查看物理内存和文件缓存情况
$ cat /proc/meminfo
MemTotal: 8182776 kB
MemFree: 3053808 kB
Buffers: 342704 kB
Cached: 3972748 kB
这台服务器总共有 8GB 物理内存(MemTotal),3GB 左右可用内存(MemFree),343MB左右用来做磁盘缓存(Buffers),4GB左右用来做文件缓存区(Cached)。
- sar
$ sar -d 2 3
Linux 2.6.9-42.ELsmp (webserver) 11/30/2008 _i686_ (8 CPU)
11:09:33 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
11:09:35 PM dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
11:09:35 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
11:09:37 PM dev8-0 1.00 0.00 12.00 12.00 0.00 0.00 0.00 0.00
11:09:37 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
11:09:39 PM dev8-0 1.99 0.00 47.76 24.00 0.00 0.50 0.25 0.05
Average: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
Average: dev8-0 1.00 0.00 19.97 20.00 0.00 0.33 0.17 0.02
重要参数:
await表示平均每次设备I/O操作的等待时间(以毫秒为单位)。
svctm表示平均每次设备I/O操作的服务时间(以毫秒为单位)。
%util表示一秒中有百分之几的时间用于I/O操作。
如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢。
如果%util接近100%,表示磁盘产生的I/O请求太多,I/O系统已经满负荷的在工作,该磁盘可能存在瓶颈。
四、Network IO
对于UDP
1、良好状态指标
接收、发送缓冲区不长时间有等待处理的网络包
2、监控工具
- netstat
对于UDP服务,查看所有监听的UDP端口的网络情况
$ watch netstat -lunp
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
udp 0 0 0.0.0.0:64000 0.0.0.0:* -
udp 0 0 0.0.0.0:38400 0.0.0.0:* -
udp 0 0 0.0.0.0:38272 0.0.0.0:* -
udp 0 0 0.0.0.0:36992 0.0.0.0:* -
udp 0 0 0.0.0.0:17921 0.0.0.0:* -
udp 0 0 0.0.0.0:11777 0.0.0.0:* -
udp 0 0 0.0.0.0:14721 0.0.0.0:* -
udp 0 0 0.0.0.0:36225 0.0.0.0:* -
RecvQ、SendQ为0,或者不长时间有数值是比较正常的。
对于UDP服务,查看丢包情况(网卡收到了,但是应用层没有处理过来造成的丢包)
$ watch netstat -su
Udp:
278073881 packets received
4083356897 packets to unknown port received.
2474435364 packet receive errors
1079038030 packets sent
packet receive errors 这一项数值增长了,则表明在丢包。
这里有对“packet receive errors”的稍微详细些的解释,它包含了7种错误,and通常表明是checksum错误。不过我们通常通过这个数值的变化来判断UDP服务是否丢包(第2项错误),不知道是否有其他什么方法来判断UDP的丢包?:
"packet receive errors" usually means:
1) data is truncated, error in checksum while copying
2) udp queue is full, so it needs to be dropped
3) unable to receive udp package from encapsulated socket
4) sock_queue_rcv_skb() failed with -ENOMEM
5) it is a short packet
6) no space for header in udp packet when validating packet
7) xfrm6_policy_check() fails
many times it means the checksum is not right.
对于TCP(来自david的经验,thx~~)
1、良好状态指标
对于TCP而言,不会出现因为缓存不足而存在丢包的事,因为网络等其他原因,导致丢了包,协议层也会通过重传机制来保证丢的包到达对方。
所以,tcp而言更多的专注重传率。
2、监控工具
# cat /proc/net/snmp | grep Tcp:
Tcp: RtoAlgorithm RtoMin RtoMax MaxConn ActiveOpens PassiveOpens AttemptFails EstabResets CurrEstab InSegs OutSegs RetransSegs InErrs OutRsts
Tcp: 1 200 120000 -1 78447 413 50234 221 3 5984652 5653408 156800 0 849
重传率 = RetransSegs / OutSegs
至于这个值在多少范围内,算ok的,得看具体的业务了。
业务侧更关注的是响应时间。