当前位置:   article > 正文

【Linux学习】shell 命令(mac、linux)及shell脚本_mac shell脚本

mac shell脚本

命令行提示符

#:表示超级管理员root用户对应的命令行。
$:表示普通用户对应的命令行。

命令行常用快捷键

快捷键功能
tab补全命令
【ctrl + a】 / 【home】光标回到命令行首
【ctrl + e】 / 【end】光标回到命令行首
ctrl + insert复制
shift + insert粘贴
Ctrl+k剪切(删除)光标处到行尾的字符*
Ctrl+u剪切(删除)光标处到行首的字符*
Ctrl+w剪切(删除)光标前的 一 个单词
Ctrl+y粘贴Ctrl+u/Ctrl+k/Ctrl+w删除的文本
Ctrl+c中断终端正在执行的任务或者删除整行*
ctrl + z暂停执行在终端运行的任务

常用linux命令

命令功能备注
passwd root修改密码
clear清屏
【reboot】/【shutdown -r now】重启主机
shutdown -h now关机
shutdown -h + 11分钟以后关机, l可以是别的数字或时间点, 例如: 11:00
exit退出shell
history查看历史命令
printf ‘%x’ 12345把12345d转换为16进制

1,目录操作

功能命令说明
查看当前所处路径pwd
新建文件夹mkdir 文件夹名称-p创建多层目录,即使目录存在也不会报错 ; mkdir dir1 dir2创建多个目录
返回上一级目录cd ..
返回上两级目录cd ../..
返回home目录cd或cd ~
返回指定目录cd - 目录名cd - 返回原目录
进入指定目录cd ./a.表示当前目录,/表示目录级别分隔符
返回根目录cd /
把上个命令的参数作为cd参数使用cd !$如 ls /opt cd !$ 表示打开/opt目录
新建文件touch test.txtLinux下没有文件后缀名区分文件类型之说,系统文件类型只有可执行文件和不可执行文件
重命名文件mv A B如文件B存在,则覆盖。参数:-i 覆盖时提示;-f 不提示强制覆盖;-n 不覆盖已经存在的文件; -v 显示为剪切移动进度。注意:只能对单个文件重命名,如果要重命名多个文件,可以for循环处理:for name in ls *.war.original; do mv $name ${name%.war.original}.war done
将/a目录移动到/b下,并重命名为cmv /a /b/c如:mv test2 test1/test1.1。 可以使用绝对路径。
删除文件rm 文件名-i 会提示;-f 强制删除不提示;-v 显示文件的删除进度; -r 删除文件夹以及里面所有文件
删除空目录rmdir 文件夹名如果文件夹非空则删除失败。-v 显示删除进度;-p 递归删除目录
比较文件内容diff 文件1 文件2
找出特定程序的路径whereis
从索引中找出文件位置locate
建立软链接ln -s /test.1.0.1 /testunlink可以去掉软链接;通过ll命令可以查看当前目录软链接-b 删除,覆盖以前建立的链接;-v 显示详细处理过程。不加-s为硬链接(以文件副本的形式存在,但不占用实际空间,只能给文件添加硬链接)
查看文件路径及目录tree -a dir路径

/bin目录(binary)是二进制执行文件目录,主要用于具体应用
/sbin目录(system binary)是系统管理员专用的二进制代码存放目录,主要用于系统管理

1)查看文件目录

功能命令说明
查看当前目录列表ls

参数列表:

功能命令说明
ls -a所有文件,包括以 . 开头的隐藏文件
ls -A显示除 “.”和“…”外的所有文件。
ls -b把文件名中不可输出的字符用反斜杠加字符编号(就象在C语言里一样)的形式列出
ls -B不输出以 “~”结尾的备份文件。
ls -c输出文件的 i 节点的修改时间,并以此排序
ls -d将目录象文件一样显示,而不是显示其下的文件
ls -i输出文件的 i 节点的索引信息。
ls -1一行只输出一个文件。
ls -l列举目录详细信息。包括权限,所属拥有着,组群,大小,创建日期,文件是否是到系统其他地方的链接,以及链接的指向别名为:ll
ls -L列出链接文件名而不是链接到的文件。
ls -m横向输出文件名,并以“,”作分格符。
ls -n用数字的 UID,GID 代替名称。
ls -N不限制文件长度。
ls -o显示文件的除组信息外的详细信息。
ls -p -F在每个文件名后附上一个字符以说明该文件的类型“*”表示可执行的普通,“
ls -q用?代替不可输出的字符。
ls -Q把输出的文件名用双引号括起来。
ls -r从后向前列举目录内容
ls -R递归的列举所有目录以及目录下的内容
ls -X以文件的扩展名(最后一个 . 后的字符)排序。
ls -s在每个文件名后输出该文件的大小。
ls -S按文件大小排列
ls -t以时间排序(说明以最近修改的日期进行排序)
ls -u以文件上次被访问的时间排序
ls --color=no不显示彩色文件名
ls --help在标准输出上显示帮助信息。
ls --version在标准输出上输出版本信息并退出。
# 列出以"t"开头文件:
ls -l t*
  • 1
  • 2

2)文件操作

功能命令说明
通过字符串替换的方式批量修改文件名rename from to filefrom:要替换的字符;to 替换的结果;file 影响域。举例:rename .jpg .png *.jpg (将所有jpg文件替换为png结尾)
显示文件类型file filename.txt多个文件用空格隔开,可以使用通配符批量匹配
计算和校验md5md5sum test.txt-b 二进制模式读取文件;-c 从指定文件中读取md5并进行校验,举例:md5sum -c md5.log(输出当前目录md5匹配的文件);

3)复制文件

功能命令说明
复制文件到指定目录cp file1 /home/B当前目录下的/home/B目录(相对路径)
复制文件到当前目录cp -r test.txt newTest.txt-r 同时复制目录下的所有文件

在cp指令前面加反斜杠可以不弹出是否覆盖的询问而直接覆盖!如:\cp -rf luo1/* luo2/ 表示用目录luo1覆盖luo2目录。

Linux之间复制文件和目录:
使用scp命令要确保使用的用户具有可读取远程服务器相应文件的权限,否则scp命令是无法起作用的。

功能命令说明
从本地复制到远程scp local_file remote_username@remote_ip:remote_folder复制到目录 local_file
从本地复制到远程scp local_file remote_username@remote_ip:remote_fileremote_file为目录+文件名,该命令修改了文件名
从远程复制到本地scp remote_username@remote_ip:remote_folder local_file
指定端口进行复制scp -P 4588 remote_username@remote_ip:remote_folder local_file远程服务器防火墙有为scp命令设置了指定的端口需要使用-p参数

如:把本地文件夹复制到远程 scp -r /opt/soft root@10.95.0.0:/opt

scp:secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。
ssh:secure shell的缩写

4)文件上传下载 sftp

  1. 上传文件
sftp> lcd 本地路径   
进入本地路径
sftp> put 本地文件 服务器绝对路径
# 查看服务器文件夹下内容
sftp> ls 服务器绝对路径

# 举例:把本地服务器的/www/wwwroot目录下面的study.log文件上传到远程服务器的/www/server目录下。
sftp> lcd /www/wwwroot
sftp> put study.log /www/server
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  1. 下载文件
# 下载文件:  
# 把远程服务器的/www/server目录下面的study.log文件下载到本地服务器的/www目录下。
sftp> get /www/server/study.log /www

# 下载文件夹:
# 把远程服务器的/www/server目录下面的test文件夹下载到本地服务器的/www目录下。
sftp> get -r /www/server/test /www

# 查看本地服务器/www目录下面的文件和文件夹
sftp> lls /www
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  1. 退出sftp
exit
  • 1

5)linux中文件颜色,蓝色,白色等各自代表的含义

文件颜色说明
绿色文件可执行文件,可执行的程序
红色文件压缩文件或者包文件
蓝色文件目录
白色文件一般性文件,如文本文件,配置文件,源码文件等
浅蓝色文件链接文件,主要是使用ln命令建立的文件
红色闪烁表示链接的文件有问题
黄色表示设备文件
灰色表示其他文件

6)文件查看和编辑

1>cat

功能命令备注
查看文件cat /etc/hosts-n 由1开始对所有输出的行数进行编号;-b 和-n一样,但是不对空白行编号;-s 遇到有连续两行以上的空白行,就代换为一行的空白行。
把多个文件合并为一个cat file1.txt file2.txt > newfile.txt
创建编辑新文件cat > head.txt使用ctrl+d 或 ctrl+c可结束编辑;cat > head.txt <<EOF EOF作为标准输入结束。
追加内容到结尾cat >> file1.txt <<EOF
清空文件内容cat /dev/null >file.txtcd $1/target/ > /dev/null 只输出错误的东西;cd $1/target/ > /dev/null 2>&1 2表示错误 1表示正确 这句话把2当1输出 由于加了/dev/null 所以都不输出

2>vi/vim(命令模式,输入模式,底线命令模式)

vi 文件         进入阅览状态,一般模式
  • 1

常用命令:

命令功能
w下一单词的第一字符
e下一单词的最后字符
b上一单词的第一字符
(到句首
)到句尾
ctrl+F上页
ctrl+B下页
dd删除当前行
x删除当前字符
u恢复前一步操作
p复制之前删除的行
G查看文件最后一页
?a从文件最后查找a
N下一个
gg光标跳到文件开头
dG清空光标到结尾的数据

按i进行编辑:
使用键盘上的Page Up和Page Down键可以上下翻页;
编辑完内容后,按下Esc键,并输入“:wq”,然后回车就可以保存退出。按:(英文冒号)就进入了底线命令模式。
常用底线命令:

命令功能备注
q退出程序
q!强制退出不保存
w保存文件
wq保存并退出
set number显示行号
:set fileencoding查看文件编码方式如utf-8
:set ff?查看文件是dos格式还是unix格式windows标识一行的结束用的是回车换行符,即’\r\n’,也叫做CRLF。linux对一行结束的标识则只有换行,即’\n’,也就是LF
set ff=unix修改格式

3>head

显示文件内容(从头显示,默认输出文件的开头10行):

head 文件名
参数:
-q 隐藏文件名
-v 显示文件名
-c 数字    显示字节数,如:-c1
-n 数字    显示多少行 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

4>tail

显示文件内容(从最后显示,默认输出文件的最后10行):

tail 文件名
参数:
-f 数字  实时的把打开文件中的新消息显示到屏幕,等同于 tailf output.txt
-c 数字 指定显示的字节数
-n 数字 指定显示的行数
--pid=进程号 与-f连用,在进程结束后自动退出tail命令
-s 秒数 监视文件变化的间隔秒数
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

5>tailf

主要用于跟踪日志文件,默认输出最后10行。
tail -f不同的是,如果文件不增长,那么不访问磁盘,也不会更改文件的访问时间。

tailf output.txt
-n 行数   指定显示行数。
  • 1
  • 2

6>grep

查找指定的字符串在文件中:

grep yun mege2.txt
grep ^Aug mege2.txt       #查找当前目的录中文件mege2.txt中 以“Aug”开始的词汇
grep [0-9] mege2.txt     #选择文件中所有包含数字的行
grep test *file   #在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行
grep -r update /etc/acpi   #- 以递归的方式查找符合条件的文件。例如,查找指定目录/etc/acpi 及其子目录(如果存在子目录的话)下所有文件中包含字符串"update"的文件
grep -rn "abc"   #以递归方式查找当前目录中包含字符串“abc”的文件
grep -v grep  #反向查找。前面各个例子是查找并打印出符合条件的行,通过"-v"参数可以打印出不符合条件行的内容。 即不包含grep的项(即过滤掉本条查询语句)
grep -a abc #过滤abc。   -a表示二进制文本当普通文本处理。主要用于grep的时候报错:Binary file (standard input) matches,Unable to write to standard out, closing consumer。

#其它参数
-i 或 --ignore-case : 忽略字符大小写的差别。 
-n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。

# 查看内存总量
grep MemTotal /proc/meminfo   
# 查看空闲内存量
grep MemFree /proc/meminfo    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

查看当前目录下包含某字串的文件:ll | grep luo

7>sed

字符串替换、删除,但不修改文件。

sed 's/string1/string2/' 1.txt         将1.txt文件中string1替换成string2显示。
sed -e 's/string1//' 1.txt                从文档中只删除词汇string1 (参数为e,动作为d)
sed -i '/test/d' test.sh  同步删除文件test.sh中的以test开头的字符串
  • 1
  • 2
  • 3

Sed 主要用来在脚本中自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。

sed [-hnV][-e<script>][-f<script文件>][文本文件]
  • 1

参数说明:

-e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
-f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
-h或--help 显示帮助。
-n或--quiet或--silent 仅显示script处理后的结果。
-V或--version 显示版本信息。
-i : edit files in place 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

动作说明:

a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦! 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

8>cut

cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。

cut  [-bn] [file]
cut [-c] [file]
cut [-df] [file]
  • 1
  • 2
  • 3

如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。

参数:

    -b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
    -c :以字符为单位进行分割。
    -d :自定义分隔符,默认为制表符tab。
    -f :与-d一起使用,指定显示哪个区域。
    -n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的
    范围之内,该字符将被写出;否则,该字符将被排除
    N:第N个字节、字符或字段
    N-:从第N个字节、字符或字段开始直至行尾
    N-M:从第N到第M(含第M)个字节、字符或字段
    -M:从第1到第M(含第M)个字节、字符或字段
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
cut -b colnum file #指定欲显示的文件内容范围,并将它们输出到标准输出设备比如:输出每行第5个到第9个字符  cut -b5-9 file.txt       
  • 1

9>AWK

AWK是一种处理文本文件的语言,是一个强大的文本分析工具。
取free命令输出的Mem行的第二列:

free -m | grep Mem |awk '{print $2}'
#最后一列(分隔域,如/opt/luo为两个域,NF为luo.分隔符可以是斜杠、空格、Tab)  $2改为$NF (field)
#倒数第二列 $2改为$(NF-1)
#第一行 $NR

#杀掉/opt/luo目录下的所有进程,grep -v grep可以避免杀死/opt/luo下的当前kill进程
kill -9 `ps -ef | grep /opt/luo | grep -v grep | awk '{print $2}'`
#取第一行最后一列
ps -ef|grep /opt/luo/ | grep -v grep |awk NR==1| awk '{print $NF}'

# 输出log.txt文件的第1、4项
awk '{print $1,$4}' log.txt
# 格式化输出
awk '{printf "%-8s %-10s\n",$1,$4}' log.txt

# -F指定分隔符,如:使用","分割
awk -F, '{print $1,$2}'   log.txt

# 设置变量 awk -v  
awk -va=1 '{print $1,$1+a}' log.txt

#awk -f {awk脚本} {文件名}
awk -f cal.awk log.txt

#过滤第一列大于2的行 
awk '$1>2' log.txt    
  • 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

10>sort

将输入的文件内容按照指定的规则进行排序,然后将排序结果输出。
常见参数:

-n:依照数值大小排序
-r:倒序排
-u:去除重复行
-t:指定分隔符
-k:按指定区间排序
  • 1
  • 2
  • 3
  • 4
  • 5
命令功能备注
sort file.txt对file.txt文件中的行进行排序

11>uniq

输出或忽略文件中的重复行。主要用于在sort命令排序后,用uniq命令对文件去重并计数。

uniq [option] [INPUT(文件或标准输入)]
-c 去除重复行,并计算每行出现的次数
-d 只显示重复的行
-u 只显示唯一的行
  • 1
  • 2
  • 3
  • 4

12>wc

统计文件的行数、单词数或字节数。

wc [option] [file]
-c  统计字节数
-l  统计行数
-m  统计字符数
-w  统计单词数
-L  统计打印最长行的长度
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  1. 统计当前文件夹下文件的个数: ls -l |grep "^-"|wc -l
  2. 统计当前文件夹下目录的个数: ls -l |grep "^d"|wc -l
  3. 统计当前文件夹下文件的个数,包括子文件夹里的:ls -lR|grep "^-"|wc -l
  4. 统计文件夹下目录的个数,包括子文件夹里的:ls -lR|grep "^d"|wc -l

grep "^-" :将长列表输出信息过滤一部分,只保留一般文件,如果只保留目录就是 ^d

13>文件格式转换

i> iconv

用于转换文件的编码格式。

iconv [options] [-f from-encoding(原编码)] [-t to-encoding] [inputfile(输入文件)]
-f encodingA 从编码A转换
-t encodingB 转换成编码B
-l 显示系统支持的编码
-o 将输出输入到指定文件
  • 1
  • 2
  • 3
  • 4
  • 5
ii> dos2unix unix2dos

dos2unix 将DOS(Windows系统)格式文件转换未UNIX格式。
DOS下的文本文件以\r\n换行,而UNIX以\n换行。

dos2unix [file]
  • 1

14> less

less 与 more 类似,但使用 less 可以随意浏览文件,而 more 仅能向前移动,却不能向后移动,而且 less 在查看之前不会加载整个文件。

ps 查看进程信息并通过 less 分页显示   
ps -aux | less -N

显示所有运行中的进程   
ps aux | less
  • 1
  • 2
  • 3
  • 4
  • 5

15>more

16>其它

命令功能备注
file somefile得到文件类型

7)文件搜索

1>find

whereis 及 locate 都是基于系统内建的数据库进行搜索,因此效率很高,而find则是遍历硬盘查找文件。

说明命令备注
从/开始进入根文件系统搜索文件和目录find / -name test搜索文件名为test的文件(注意为精确匹配,模糊匹配需要搭配通配符一起使用)
搜索属于用户“user1”的文件和目录find / -user user1
在目录“/home/user1”中搜索带有“.bin”结尾的文件find /home/user1 -name *.bin
统计所有符合要求的文件`find *.jarwc -l`

2,系统资源查看

1)系统

功能命令备注
查看内核/操作系统/CPU信息cat /proc/version cat /proc/cpuinfo 或 uname --help查看相关命令
查看发行版本号cat /etc/redhat-release /etc/centos-release
查看环境变量env
查看系统负载cat /proc/loadavg
查看系统64/32位getconf LONG_BIT

2)CPU

功能命令
cpu信息lscpu

3)硬盘

功能命令参数举例
显示磁盘空间使用情况df-a 全部文件系统列表-;-h 以方便阅读的方式显示信息;-i 显示inode信息;-k 区块为1024字节;-l 只显示本地磁盘;-T 列出文件系统类型显示已经挂载的分区列表的磁盘使用:df -lh
查看文件和目录磁盘使用的空间du显示dir1的磁盘使用情况:du -sh dir1
查看挂接的分区状态`mountcolumn -t`
查看所有交换分区swapon -s
用法:du [参数][文件]
 或:du [v]目录
计算每个文件的磁盘用量,目录则取总用量。
 
常用参数:
  -a, --all             输出所有文件的磁盘用量
  -B, --block-size=大小 使用指定字节数的块
  -b, --bytes           -k (KB) -m(MB)
  -c, --total           显示总计信息
  -h, --human-readable  以易读方式显示文件大小(自动匹配m、G)
      --si              类似-h,但在计算时使用1000 为基底而非1024
  -S, --separate-dirs   不包括子目录的占用量;仅显示总计
      --max-depth=N     显示目录总计(与--all 一起使用计算文件)
                        当N 为指定数值时计算深度为N;
                        --max-depth=0 等于--summarize
      --time            显示目录或该目录子目录下所有文件的最后修改时间
      --time=WORD       显示WORD 时间,而非修改时间:
                        atime,access,use,ctime 或status
      --help            显示此帮助信息并退出
      --version         显示版本信息并退出
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

1>硬盘分区

分区功能大小限制查看命令
swap(交换分区)用来支持虚拟内存最小容量是max(内存大小,16MB);最大可以达127MBfree -g
root(根分区)(是/目录,而不是/root目录)启动系统所需的文件和系统配置文件大多数系统50~100M即可df -h
/usrLinux系统的许多软件所在地方,基于RPM的包安装时使用尽可能的大
/home用户home目录所在地大小取决于Linux有多少用户,以及这些用户存放多少数据。对于网站建设者,web服务和匿名Ftp/home/ftp的服务器内容也放在这里
/usr/local与其余Linux系统不同的软件,如不是RPM包的软件。
/usr/src存放Linux内核源程序;存放RPM包的源程序。
/tmp用来存放临时文件
/varLinux系统将把日志写在/var/log。打印队列的文件通常写在/var/spool 。
/boot所有LILO 启动时需要的文件都在/boot目录。

2>HDA、SDA、VDA:

硬盘的种类主要是SCSI 、IDE 、以及现在流行的SATA等。在linux中, HDA是IDE硬盘的名称,SDA是SATA的名称。在2.6.19内核里,所有的硬盘都叫SDA。
云操作系统下的硬盘一般叫做VDA。KVM虚拟机为了提升性能,一般使用virtio作为磁盘驱动,在虚拟机里面磁盘会显示成vda而不是传统的sda。通过修改/etc/udev/rules.d/10-local.rules文件可以将硬盘显示为sda(没用试过不知道好用不)。

3>fdisk(Partition table manipulator for Linux, 磁盘分区工具)

fdisk 作为分区工具,可以把磁盘划分为若干分区,同时也能为每个分区指定文件系统,如linux、fat32、 linux 、linux swap 、fat16 以及其实类Unix类操作系统的文件系统等。
与df区别:侧重于显示当前系统中所有文件系统信息,fdisk侧重于显示分区表的信息。

常用命令:

i>查看
fdisk -l   查看当前磁盘分区信息(主要是分区表信息)

显示内容如下《《《《《《《《《《《《《《《《《
Disk /dev/hda: 80.0 GB, 80026361856 bytes    #硬盘80g
255 heads, 63 sectors/track, 9729 cylinders   #有255个磁面;63个扇区;9729个磁柱;
Units = cylinders of 16065 * 512 = 8225280 bytes   #每个 cylinder(磁柱)的容量是 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1         765     6144831    7  HPFS/NTFS     
/dev/hda2             766        2805    16386300    c  W95 FAT32 (LBA)
/dev/hda3            2806        9729    55617030    5  Extended
/dev/hda5            2806        3825     8193118+  83  Linux
/dev/hda6            3826        5100    10241406   83  Linux
/dev/hda7            5101        5198      787153+  82  Linux swap / Solaris
/dev/hda8            5199        6657    11719386   83  Linux
/dev/hda9            6658        7751     8787523+  83  Linux
/dev/hda10           7752        9729    15888253+  83  Linux

Disk /dev/sda: 1035 MB, 1035730944 bytes
256 heads, 63 sectors/track, 125 cylinders
Units = cylinders of 16128 * 512 = 8257536 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1          25      201568+   c  W95 FAT32 (LBA)
/dev/sda2              26         125      806400    5  Extended
/dev/sda5              26          50      201568+  83  Linux
/dev/sda6              51          76      200781   83  Linux
《《《《《《《《《《《《《《《《《《《《《《《《《《《

显示内容讲解:
1)机器挂载了两个硬盘:hda、sda
2)hda有三个主分区(包括扩展分区):hda1 hda2 hda3(Extended扩展分区);逻辑分区是hd5-hda10。
  sda有两个主分区:sda1 sda2(扩展分区);逻辑分区是sda5 sda6
3)磁盘总容量=主分区总容量;扩展分区容量=逻辑分区总容量。即:sda=sda1+sda2;sda2=sda5+sda6
4)引导(Boot):表示引导分区,在上面的例子中 hda1 是引导分区;
   Start (开始):表示的一个分区从X cylinder(磁柱)开始;
   End (结束):表示一个分区到 Y cylinder(磁柱)结束;
估算一个存储设备是否被完全划分: cylinders(柱体) 上一个分区的End 和 下一个分区的Start是不是一个连续的数字。连续的数字表示两个分区之间没有空白的分区,是连续的,以此类推就可以知道是不是完全划分。
5)id和System 表示的是一个意思,id看起来不太直观,我们要在fdisk 一个分区时,通过指定id来确认分区类型;比如 7表示的就NTFS 分区;这个在fdisk 中要通过t功能来指定
6)Blocks(容量):单位是K
  • 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
ii>添加/删除分区
fdisk /dev/sda
Command (m for help):  在这里按m ,就会输出帮助;
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition    #删除一个分区;如果想删除sda6,那么在接下来的选择中填写对应数字6即可。扩展分区删除会连逻辑分区一并删除,如果删错,用q不保存退出。
   l   list known partition types   #列出分区类型,以供我们设置相应分区的类型;
   m   print this menu  #列出帮助信息;
   n   add a new partition  #添加一个分区;
   o   create a new empty DOS partition table 
   p   print the partition table    #列出分区表;
   q   quit without saving changes  #不保存退出;
   s   create a new empty Sun disklabel    
   t   change a partition's system id  #改变分区类型;
   u   change display/entry units  
   v   verify the partition table
   w   write table to disk and exit  #把分区表写入硬盘并退出;
   x   extra functionality (experts only)  #扩展应用,专家功能;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

3>磁盘文件格式

文件系统对应centos系统特点场景
ext2适用于U盘
ext3centos5默认文件系统fsck时需要耗费大量时间(文件越多,时间越长)
ext4centos6在fsck时用的时间相对较少硬盘中,小文件较少
xfscentos7.0硬盘中,小文件较多

tmpfs
是一种基于内存的文件系统,tmpfs 数据在重新启动之后不会保留,因为虚拟内存本质上就是易失的。

ext4
第四代扩展文件系统(英语:Fourth EXtended filesystem,缩写为ext4)是linux系统下的日志文件系统

fsck(file system check)
用来检查和维护不一致的文件系统。若系统掉电或磁盘发生问题,可利用fsck命令对文件系统进行检查

xfs
一种非常优秀的日志文件系统,xfs在很多方面确实做的比ext4好,ext4受限制于磁盘结构和兼容问题,可扩展性和scalability确实不如xfs。ext系列文件系统内部结构相对简单一些,出问题后恢复相对容易。
一般系统盘做xfs,数据盘做ext4

4>磁盘格式化

命令功能
mkfs [tab] [tab]按下两下tab键查看系统支持哪些文件系统的格式化功能
mkfs -t [文件系统格式名]等同于mkfs.文件系统格式名
mkfs -t xfs与 mkfs.xfs相同
mkfs.xfs /dev/sdb格式化磁盘,第一次执行mkfs.xfs可能需要安装:apt-get install xfsprogs

5>磁盘挂载

功能命令备注
挂载一个文件系统mount /dev/hda2 /mnt/hda2挂在一个叫做hda2的盘-确定目录“/mnt/hda2”已经存在
卸载一个文件系统umount /dev/hda2一个叫做hda2的盘-先从挂载点“/mnt/hda2”退出
查看所有设备label和uuidblkid
查看系统分区lsblk系统盘:安装系统的盘;数据盘:存储数据的盘。
i> lsblk查看系统分区
参数:-a, --all            显示所有设备。
-b, --bytes          以bytes方式显示设备大小。
-d, --nodeps         不显示 slaves 或 holders。
-D, --discard        print discard capabilities。
-e, --exclude <list> 排除设备 (default: RAM disks)。
-f, --fs             显示文件系统信息。
-h, --help           显示帮助信息。
-i, --ascii          use ascii characters only。
-m, --perms          显示权限信息。
-l, --list           使用列表格式显示。
-n, --noheadings     不显示标题。
-o, --output <list>  输出列。
-P, --pairs          使用key="value"格式显示。
-r, --raw            使用原始格式显示。
-t, --topology       显示拓扑结构信息。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
ii> 自动挂载文件:/etc/fstab文件

磁盘被手动挂载之后都必须把挂载信息写入/etc/fstab这个文件中,系统开机时会主动读取/etc/fstab这个文件中的内容,根据文件里面的配置挂载磁盘。这样我们只需要将磁盘的挂载信息写入这个文件中我们就不需要每次开机启动之后手动进行挂载了。
在这里插入图片描述

第一列:磁盘设备文件或者该设备的Label或者UUID。通过命令blkidk可查看所有设备的label和uuid.
第二列:设备的挂载点,就是你要挂载到哪个目录下
第三列:磁盘文件系统的格式,包括ext2、ext3、reiserfs、nfs、vfat等
第四列:文件系统的参数

参数说明
Async/sync设置是否为同步方式运行,默认为async
auto/noauto当下载mount -a 的命令时,此文件系统是否被主动挂载。默认为auto
rw/ro是否以以只读或者读写模式挂载
exec/noexec限制此文件系统内是否能够进行"执行"的操作
user/nouser是否允许用户使用mount命令挂载
suid/nosuid是否允许SUID的存在
Usrquota启动文件系统支持磁盘配额模式
Grpquota启动文件系统对群组磁盘配额模式的支持
Defaults同时具有rw,suid,dev,exec,auto,nouser,async等默认参数的设置
第五列:能否被dump备份命令作用:dump是一个用来作为备份的命令。通常这个参数的值为0或者1
说明
0代表不要做dump备份
1代表要每天进行dump的操作
2代表不定日期的进行dump操作
第六列:是否检验扇区:开机的过程中,系统默认会以fsck检验我们系统是否为完整(clean)。
说明
0不要检验
1最早检验(一般根目录会选择)
21级别检验完成之后进行检验

6>磁盘扩容

全部扩容

扩容后重启发现lsblk和df -h大小不一致:

lsblk 查看的是block device,也就是逻辑磁盘大小。
df查看的是file system, 也就是文件系统层的磁盘大小。
如果block device容量变大,但还没有反映到file system中,更新命令(即全部扩容):
ext{2,3,4}文件系统:`resize2fs /dev/vda2`
xfs文件系统:`xfs_growfs /dev/vda2`
  • 1
  • 2
  • 3
  • 4
  • 5

7>SAR命令

sar --help
用法: sar [ options选项 ] [ <interval时间间隔> [ <count次数> ] ]

-A:所有报告的总和
-u:输出CPU使用情况的统计信息
-v:输出inode、文件和其他内核表的统计信息
-d:输出每一个块设备的活动信息
-r:输出内存和交换空间的统计信息
-b:显示I/O和传送速率的统计信息
-a:文件读写情况
-c:输出进程统计信息,每秒创建的进程数
-R:输出内存页面的统计信息
-y:终端设备活动情况
-w:输出系统交换活动信息
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

结果说明:

a) cpu信息
sar -u 1
  • 1

在这里插入图片描述

列名说明备注
CPUall 表示统计信息为所有 CPU 的平均值。
%user用户模式下消耗的CPU时间的比例;
%nice通过nice改变了进程调度优先级的进程,在用户模式下消耗的CPU时间的比例;
%system系统模式下消耗的CPU时间的比例;
%iowaitCPU等待磁盘I/O而导致空闲状态消耗时间的比例;如果 %iowait 的值过高,表示硬盘存在I/O瓶颈
%steal利用Xen等操作系统虚拟化技术时,等待其他虚拟CPU计算占用的时间比例;
%idleCPU没有等待磁盘I/O等的空闲状态消耗的时间比例如果 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量;如果 %idle 的值持续低于 10,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU。
b)inode、文件和其他内核表监控
sar -v 1 5
  • 1

在这里插入图片描述

列名说明
dentunusd目录高速缓存中未被使用的条目数量
file-nr文件句柄(file handle)的使用数量
inode-nr索引节点句柄(inode handle)的使用数量
pty-nr使用的pty数量
c)内存和交换空间监控
sar -r 1 5
  • 1

在这里插入图片描述

列名说明
kbmemfree这个值和free命令中的free值基本一致,所以它不包括buffer和cache的空间.
kbmemused这个值和free命令中的used值基本一致,所以它包括buffer和cache的空间.
%memused这个值是kbmemused和内存总量(不包括swap)的一个百分比.
kbbuffers和kbcached这两个值就是free命令中的buffer和cache.
kbcommit保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap).
%commitv这个值是kbcommit与内存总量(包括swap)的一个百分比.
d)内存分页监控
sar -B 10 3
  • 1

在这里插入图片描述

列名说明
pgpgin/s表示每秒从磁盘或SWAP置换到内存的字节数(KB)
pgpgout/s表示每秒从内存置换到磁盘或SWAP的字节数(KB)
fault/s每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor)
majflt/s每秒钟产生的主缺页数.
pgfree/s每秒被放入空闲队列中的页个数
pgscank/s每秒被kswapd扫描的页个数
pgscand/s每秒直接被扫描的页个数
pgsteal/s每秒钟从cache中被清除来满足内存需要的页个数
%vmeff每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)的百分比
e)磁盘IO
sar -b 1 5
  • 1

在这里插入图片描述

列名说明
tps每秒钟物理设备的 I/O 传输总量
rtps每秒钟从物理设备读入的数据总量
wtps每秒钟向物理设备写入的数据总量
bread/s每秒钟从物理设备读入的数据量,单位为 块/s
bwrtn/s每秒钟向物理设备写入的数据量,单位为 块/s
f)进程队列长度和平均负载状态监控
sar -q 1 5
  • 1

在这里插入图片描述

列名说明
runq-sz运行队列的长度(等待运行的进程数)
plist-sz进程列表中进程(processes)和线程(threads)的数量
ldavg-1最后1分钟的系统平均负载(System load average)
ldavg-5过去5分钟的系统平均负载
ldavg-15过去15分钟的系统平均负载
h)系统交换活动信息监控
sar -W 1 5
  • 1

在这里插入图片描述

列名说明
pswpin/s每秒系统换入的交换页面(swap page)数量
pswpout/s每秒系统换出的交换页面(swap page)数量
i)设备使用情况监控
sar -d 1 5 -p

参数-p可以打印出sda,hdc等磁盘设备名称,如果不用参数-p,设备节点则有可能是dev8-0,dev22-0
  • 1
  • 2
  • 3

在这里插入图片描述

列名说明备注
tps每秒从物理磁盘I/O的次数.多个逻辑请求会被合并为一个I/O磁盘请求,一次传输的大小是不确定的.
rd_sec/s每秒读扇区的次数.
wr_sec/s每秒写扇区的次数.
avgrq-sz平均每次设备I/O操作的数据大小(扇区).
avgqu-sz磁盘请求队列的平均长度.avgqu-sz 的值较低时,设备的利用率较高。
await从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1秒=1000毫秒).
svctm系统处理每次请求的平均时间,不包括在请求队列中消耗的时间.
%utilI/O请求占CPU的百分比,比率越大,说明越饱和.当%util的值接近 1% 时,表示设备带宽已经占满。
j)网络信息
# 1s打印一次网络io
sar -n DEV 1
  • 1
  • 2

在这里插入图片描述

列名说明
IFACELAN接口
rxerr/s每秒钟接收的坏数据包
txerr/s每秒钟发送的坏数据包
coll/s每秒冲突数
rxdrop/s因为缓冲充满,每秒钟丢弃的已接收数据包数
txdrop/s因为缓冲充满,每秒钟丢弃的已发送数据包数
txcarr/s发送数据包时,每秒载波错误数
rxfram/s每秒接收数据包的帧对齐错误数
rxfifo/s接收的数据包每秒FIFO过速的错误数
txfifo/s发送的数据包每秒FIFO过速的错误数

8>iostat命令

# 查看磁盘IO
iostat -d -k -x 3

默认上,iostat以B为单位衡量I/O系统
-k   以KB为单位
-m   以MB为单位


-x  增加其它数据:
rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge);wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。
rsec/s:每秒读取的扇区数;wsec/:每秒写入的扇区数。r/s:The number of read requests that were issued to the device per second;w/s:The number of write requests that were issued to the device per second;
await:每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。
%util:在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在这里插入图片描述
第一部分包含了CPU报告

列名说明
%user显示了在执行用户(应用)层时的CPU利用率
%nice显示了在以nice优先级运行用户层的CPU利用率
%system显示了在执行系统(内核)层时的CPU利用率
%iowait显示了CPU在I/O请求挂起时空闲时间的百分比
%steal显示了当hypervisor正服务于另外一个虚拟处理器时无意识地等待虚拟CPU所占有的时间百分比。
%idle显示了CPU在I/O没有挂起请求时空闲时间的百分比

第二部分包含了设备利用率报告

列名说明
Device列出的/dev 目录下的设备/分区名称
tps显示每秒传输给设备的数量。更高的tps意味着处理器更忙。
Blk_read/s显示了每秒从设备上读取的块的数量(KB,MB)
Blk_wrtn/s显示了每秒写入设备上块的数量(KB,MB)
Blk_read显示所有已读取的块
Blk_wrtn显示所有已写入的块

9>vmstat(VirtualMeomoryStatistics,虚拟内存统计)

可对操作系统的虚拟内存、进程、CPU等的整体情况进行监视。

vmstat  -help

Usage:
 vmstat [options] [delay [count]]

Options:
 -a, --active           active/inactive memory
 -f, --forks            number of forks since boot
 -m, --slabs            slabinfo
 -n, --one-header       do not redisplay header
 -s, --stats            event counter statistics
 -d, --disk             disk statistics
 -D, --disk-sum         summarize disk statistics
 -p, --partition <dev>  partition specific statistics
 -S, --unit <char>      define display unit
 -w, --wide             wide output
 -t, --timestamp        show timestamp

 -h, --help     display this help and exit
 -V, --version  output version information and exit

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
命令说明备注
vmstat 3 10以3秒为时间间隔,连续收集10次性能数据

结果解读:

字段类别说明
rprocs(进程)在运行队列中等待的进程数
bprocs在等待io的进程数
swpdmemory(内存)已经使用的交换内存(kb)
freememory空闲的物理内存(kb)
buffmemory用做缓冲区的内存数(kb)
cachememory用做高速缓存的内存数(kb)
siswap(交换页面)从磁盘交换到内存的交换页数量(kb/秒)
soswap从内存交换到磁盘的交换页数量(kb/秒)
biIO(块设备)发送到块设备的块数(块/秒)
boIO从块设备中接收的块数(块/秒)
insystem(系统)每秒的中断数,包括时钟中断
cssystem每秒的上下文切换次数
usCPU(处理器)用户进程使用的cpu时间(%)
syCPU系统进程使用的cpu时间(%)
idCPUCPUT空闲时间(%)
waCPU等待IO所消耗的cpu时间(%)
stCPU从虚拟设备中获得的时间(%)

4)进程

按q退出,按h进入帮助。

1>PS(process status,查看当前运行的进程状态)

linux上进程有5种状态,ps对应5种状态码:

  1. R runnable (on run queue) 运行(正在运行或在运行队列中等待)
  2. S sleeping 中断
  3. D uninterruptible sleep (usually IO)不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
  4. Z a defunct (”zombie”) 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)
  5. T traced or stopped 停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)

常用参数:

-A 显示所有进程
a 显示所有进程
-a 显示同一终端下所有进程
c 显示进程真实名称
e 显示环境变量
f 显示进程间的关系
r 显示当前终端运行的进程
-aux 显示所有包含其它使用的进程,显示的列内容:USER PID %CPU %MEM  


举例:
##查询进程  
ps aux | grep 文件/服务 
##显示所有运行中的进程
ps aux | less

##显示当前所有进程环境变量及进程间关系
ps -ef
##进程数
ps -ef | wc -l
##查询jar包运行的进程号
ps -ef | grep java | grep /opt/test.jar|grep -v grep|awk ' { print $2 } '
## 进程启动时间查看
ps -p PID -o lstart

##显示当前所有进程
ps -A
## 查看僵尸进程 
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 -A -o stat,ppid,pid,cmd | grep -e '^[Zz]'
  • 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
功能命令备注

查看tomcat线程以及luo进程是否存在| ps -ef|grep tomcat|grep luo
线程数| ps -xH | wc -l

2>kill(杀进程)

功能命令备注
kill -9 6866(进程id)杀死进程
# 杀掉以/opt/luo开头的所有进程 
# `··`(反点)和`$()`意思一样 执行脚本的意思;`‘’`(双引号)表示字符串
kill -9 ` ps -ef | grep /opt/luo | grep -v grep | awk '{print $2}'` 

# 除${NSTALL_PATH}/bin/shell/uninstall.sh相关的进程, 关闭NSTALL_PATH路径下的所有进程
ps -ef | grep "$NSTALL_PATH" | grep -v grep | grep -v ${NSTALL_PATH}/bin/shell/uninstall.sh | awk '{print $2}' | xargs kill -9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3>open files

too many open files是Linux系统中常见的错误,主要是进程持有句柄(handle)数超出系统限制。句柄包含:文件、连接(socket、端口占用)。

功能命令备注
查看当前系统设置的最大句柄数ulimit -aopen files那一行就代表系统目前允许单个进程打开的最大句柄数
查询当前系统上进程默认最多打开的文件描述符(句柄)数量cat /proc/PID/limits一般跟随父进程设置;默认为4096
查看单个进程文件句柄数lsof -p PID`lsof -p PID
查看当前系统句柄数(文件描述符)ulimit -n
增大允许打开的文件数(临时)ulimit -n 2048重启后会还原为默认值。非root用户只能设置到4096;想要设置到更大需要sudo权限或者root用户。
查看进程当前fd(文件描述)或者IOcd /proc/6244/fd && llpid=6244
修改最大文件打开数echo -e "root soft nofile 65535\nroot hard nofile 65535\n* soft nofile 65535\n* hard nofile 65535\n" >> /etc/security/limits.conf
修改最大进程数sed -i 's#4096#65535#g' /etc/security/limits.d/20-nproc.conf

增大允许打开的文件数(修改系统配置文件):

vim /etc/security/limits.conf
  • 1

#在最后加入

* soft nofile 4096  
* hard nofile 4096  
  • 1
  • 2

或者只加入

 * - nofile 8192
  • 1

最前的 * 表示所有用户,可根据需要设置某一用户,例如

roy soft nofile 8192  
roy hard nofile 8192  
  • 1
  • 2

注意”nofile”项有两个可能的限制措施。就是项下的hard和soft。 要使修改过得最大打开文件数生效,必须对这两种限制进行设定。 如果使用”-“字符设定, 则hard和soft设定会同时被设定。

lsof 命令:list open files
命令说明备注
lsof -i UDP查看udp网络连接
lsof -i 端口号查看端口占用情况

4>supervisorctl (进程管理)

命令说明备注
supervisorctl status查看所有子进程的状态第一列是服务名;第二列是运行状态,RUNNING表示运行中,FATAL 表示运行失败,STARTING表示正在启动,STOPED表示任务已停止; 第三/四列是进程号,最后是任务已经运行的时间。
supervisorctl status 服务名查看单个任务状态
supervisorctl stop 服务名关闭任务
supervisorctl stop all关闭所有进程
supervisorctl start 服务名启动任务
supervisorctl start all启动所有进程之后再关闭supervisord服务 kill -9 pid
supervisorctl restart 服务名重启任务
supervisorctl update重新载入配置文件
supervisorctl shutdown关闭supervisord
supervisorctl clear 进程名清空进程日志

5> top命令

通过top命令对进程的显示方式进行控制。

VIRT:virtual memory usage 虚拟内存
1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等
2、假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量

RES:resident memory usage 常驻内存
1、进程当前使用的内存大小,但不包括swap out
2、包含其他进程的共享
3、如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反
4、关于库占用内存的情况,它只统计加载的库文件所占内存大小
VIRT = SWAP + RES;RES = CODE + DATA

SHR:shared memory 共享内存
1、除了自身进程的共享内存,也包括其他进程的共享内存
2、虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小
3、计算某个进程所占的物理内存大小公式:RES – SHR
4、swap out后,它将会降下来

DATA
1、数据占用的内存。如果top没有显示,按f键可以显示出来。
2、真正的该程序要求的数据空间,是真正在运行中要使用的。

查看进程中cpu占用高的几个线程:top -Hp PID

参数说明
-o 字段名按字段排序
d指定每两次屏幕信息刷新之间的时间间隔。单位为秒
p通过指定监控进程ID来仅仅监控某个进程的状态。
q该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。
S指定累计模式。
s使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
i使top不显示任何闲置或者僵死进程。
c显示整个命令行而不只是显示命令名。

进入top后交互命令:

命令说明
f选择显示的内容(上下键选择)
q退出
x当前排序字段
N以 PID 的大小的顺序排列表示进程列表
P以 CPU 占用率大小的顺序排列进程列表 %CPU
M以内存占用率大小的顺序排列进程列表 %MEM
h显示帮助
n设置在进程列表所显示进程的数量

top结果说明:
在这里插入图片描述

第一行为任务队列信息(同uptime命令):系统运行时间、(当前登录)用户数、负载(系统负载,即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。)
第二、三行为进程和CPU的信息:

Tasks: 29 total进程总数
1 running正在运行的进程数
28 sleeping睡眠的进程数
0 stopped停止的进程数
0 zombie僵尸进程数
Cpu(s): 0.3% us用户空间占用CPU百分比
1.0% sy内核空间占用CPU百分比
0.0% ni用户进程空间内改变过优先级的进程占用CPU百分比
98.7% id空闲CPU百分比
0.0% wa等待输入输出的CPU时间百分比
0.0% hi
0.0% si

第四五行为内存信息:

Mem: 191272k total物理内存总量
173656k used使用的物理内存总量
17616k free空闲内存总量
22052k buffers用作内核缓存的内存量
Swap: 192772k total交换区总量
0k used使用的交换区总量
192772k free空闲交换区总量
123988k cached缓冲的交换区总量。 内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖, 该数值即为这些内容已存在于内存中的交换区的大小。相应的内存再次被换出时可不必再对交换区写入。

top列表每一列含义及如何展示:

列名说明是否默认展示
PID进程id默认展示
PPID父进程id
RUSERReal user name默认展示
UID进程所有者的用户id
USER进程所有者的用户名
GROUP进程所有者的组名
TTY启动进程的终端名。不是从终端启动的进程则显示为 ?
PR优先级默认展示
NInice值。负值表示高优先级,正值表示低优先级默认展示
P最后使用的CPU,仅在多CPU环境下有意义
%CPU上次更新到现在的CPU时间占用百分比默认展示
TIME进程使用的CPU时间总计,单位秒
TIME+进程使用的CPU时间总计,单位1/100秒默认展示
%MEM进程使用的物理内存百分比默认展示
VIRT进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES默认展示
SWAP进程使用的虚拟内存中,被换出的大小,单位kb。
RES进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA默认展示
CODE可执行代码占用的物理内存大小,单位kb
DATA可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
SHR共享内存大小,单位kb默认展示
nFLT页面错误次数
nDRT最后一次写入到现在,被修改过的页面数。
S 进程状态。(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)默认展示
COMMAND命令名/命令行默认展示
WCHAN若该进程在睡眠,则显示睡眠中的系统函数名
Flags任务标志,参考 sched.h

6>其它

功能命令
显示进程树状图pstree
查找进程pgrep 进程名称

5)内存

功能命令参数实例
显示内存使用情况free [-bkmotV][-s <间隔秒数>]-b  以Byte为单位显示; -k KB;-m MB;-h  以合适的单位显示内存使用情况,最大为三位数,自动计算对应的单位值(b、k、m、g(gigas)、t);-o  不显示缓冲区调节列。 -s<间隔秒数>  持续观察内存使用状况。 -t  显示内存总和列。 -V  显示版本信息。free -g -s 10 //每10s 执行一次命令 available列的值即为可用内存(g)

在这里插入图片描述

total——总物理内存
used——已使用内存
free——完全未被使用的内存
shared——应用程序共享内存
buffers——缓存,主要用于目录方面,inode值等(ls大目录可看到这个值增加),一般主要是es等占用巨大
cached——缓存,用于已打开的文件
available——可用内存。根据可用内存buff/cache自动调整。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

linux的缓存机制是这样的,当第一次读取一个文件时,一份放到内存cache中,另外一份放到运行程序的内存中,当下次再使用的时候,直接从cache中读取数据,速度就会快很多,但是有频繁的读写,而drop_cache默认是不释放的,就导致cache占用越来越多,物理内存会逐渐被吃了,当然此设置也是可以修改的,我们下面看怎么临时释放cache内存。

释放之前执行sync命令同步数据导硬盘中。

sync
  • 1

释放缓存:

echo 3 > /proc/sys/vm/drop_caches
--0:不释放(系统默认值)           
--1:释放页缓存
--2:释放dentries和inodes
--3:释放所有缓存
  • 1
  • 2
  • 3
  • 4
  • 5

对于数据库来,除了释放1 2 3的缓存之外,还需要重启数据库。

6)watch命令

检测一个命令的运行结果。

watch [options] command
-d:高亮显示指令输出信息的不同之处
-n:指定命令执行的时间间隔(默认单位为秒)
-t:不显示标题
  • 1
  • 2
  • 3
  • 4

举例:

watch -n 1 'psql -c "select now();"'
比pg的\watch命令更加灵活
  • 1
  • 2

3,系统操作

功能命令备注
显示月历cal
查看主机名hostname
查看主机详情hostnamectl
修改主机名vi /etc/hostname 或者 hostnamectl set-hostname <主机名>修改后需要重启
查看当前 PATH 配置echo $PATH
显示一个二进制文件或可执行文件的完整路径which haltwhich 是在 $PATH就是指定的路径中,搜索某个系统命令的位置,并返回第一个搜索结果。使用 which 命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。
显示一个二进制文件,源码或man的位置whereis haltwhereis 命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。
查询进程ps auxgrep 文件/服务
查看硬件时间hwclock -r -u
修改硬件时间date -s “2019-1-21 10:00:00” && hwclock –w
查看软件时间date
修改软件时间date -s “Tue Dec 3 10:56:25 CST 2019”
将软件时间写入硬件时间sudo hwclock -w; hwclock -r ; date
禁用SELinux/etc/selinux/config文件,将SELINUX=enforcing改为SELINUX=disabled修改后reboot,执行getenforce 可确认状态
查看系统启动时间date -d “$(awk -F. ‘{print $1}’ /proc/uptime) second ago” +“%Y-%m-%d %H:%M:%S”/proc/uptime文件记录了系统已运行时间,单位秒

1)用户

功能命令备注
查看活动用户w
查看指定用户信息id <用户名>
查看用户登录日志last
查看系统所有用户cut -d: -f1 /etc/passwd
查看系统所有组cut -d: -f1 /etc/group
查看当前用户的计划任务crontab -l
变更为其他使用者的身份,除 root 外,需要键入该使用者的密码su root

2)服务

功能命令备注
列出所有系统服务chkconfig --list
列出所有启动的系统服务`chkconfig --listgrep on`

3)systemctl命令

systemctl是Systemd 的主命令,可用于管理系统。

功能命令备注
查看版本号systemctl --version
安装位置whereis systemd
列出所有servicesystemctl list-units --type=service
分析启动时各个进程花费的时间systemd-analyze blame
列出所有服务(包括启用的和禁用的)systemctl list-unit-files --type=service--state=active active状态(运行或退出)
--state=running正在运行的服务;failed、enabled
操作服务systemctl [command] gateway-servicecommand 主要有:
start、
restart、
stop、
status、
enable(启用开机自启)、
disable、
reload(不关闭 unit 的情况下,重新载入配置文件,让设置生效。)、
show(列出配置)、
mask(注销,注销后你就无法启动这个 service了)、
unmask(取消对 unit 的注销)、
is-active、kill
查看系统日志journalctl -u gateway-service

4)rpm

功能命令备注
查看所有安装的软件包rpm -qa
查看rpm包安装路径rpm -ql 包名
安装rpm包rpm -ivp package1.rpm package2.rpm
安装rpm显示安装进度-ivh
卸载rpm包rpm -ef package1 package2
升级软件包-Uvh
列出RPM软件包内的文件rpm -qpl package1.rpm
列出RPM软件包的描述信息-qpi
查找指定文件属于哪个RPM软件包-qf
校验所有的RPM软件包,查找丢失的文件-Va
删除包-e

5)ansible

1>概念

Ansible是一个开源配置管理工具,可以使用它来自动化任务,部署应用程序实现IT基础架构。
默认情况下,Ansible使用SSH协议在管理机和客户机之间进行通信。可以使用SFTP与客户机进行安全的文件传输。

  1. 控制节点(Control node):安装了Ansible的节点,也叫Ansible服务器端,管理机。需要安装Python和Ansible所需的各种依赖库。
  2. 受控节点(Managed nodes):也叫客户机,就是想用Ansible执行任务的客户服务器。不需要安装Ansible,消除了管理开销。
  3. 清单(Inventory):受控节点的列表,就是所有要管理的主机列表。
  4. host文件:清单列表通常保存在一个名为host文件中。在host文件中,可以使用IP地址或者主机名来表示具体的管理主机和认证信息,并可以根据主机的用户进行分组。缺省文件:/etc/ansible/hosts,可以通过-i指定自定义的host文件。
  5. 模块(Modules):模块是Ansible执行特定任务的代码块。比如:添加用户,上传文件和对客户机执行ping操作等。Ansible现在默认自带450多个模块,Ansible Galaxy公共存储库则包含大约1600个模块。
  6. 任务(Task):是Ansible客户机上执行的操作。可以使用ad-hoc单行命令执行一个任务。
  7. 剧本(Playbook):是利用YAML标记语言编写的可重复执行的任务的列表,playbook实现任务的更便捷的读写和贡献。比如,在Github上有大量的Ansible playbooks共享。
  8. 角色(roles):角色是Ansible 1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等

2>常用命令

注意,ansibled命令的使用需要在各个结点之间建立 ssh凭据。
参数说明:

-i,  选择 host文件  缺省文件:/etc/ansible/hosts
all, 指定Ansible应该在所有主机上运行此命令
-b,  --become:特权方式运行命令。
-m,  model 要使用的模块名称。
-a,  --args:制定模块所需的参数。
-u,  制定连接的用户名。
-h, --help显示帮助内容。
-v,--verbose以详细信息模式运行命令,可以用来调试错误。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

执行每个节点的 /bin/shell/stop.sh脚本:

ansible -i  hostlist all -b -m shell -a /bin/shell/stop.sh
  • 1

ping所有节点

ansible all -m ping
  • 1

ad-hoc命令,运行单个任务:

ansible web -b -m service -a "name=httpd enabled=yes"
# web, web组
# 启动httpd服务命令
  • 1
  • 2
  • 3

3>ssh多台服务器连接

首先建立ssh信任连接一般给固定某个用户。
进入目录可查看ssh凭据:

cd ~/.ssh/    	进入ssh凭据目录
ll			  	查看凭据,id_rsa为私钥,id_rsa.pub为公钥    vim id_rsa.pub即可查看公钥
ssh-keygen -t rsa		凭据生成,-t后面跟具体的算法rsa或dsa,默认为rsa。一路回车选择默认即可。然后ll即可查看凭据
cp id_rsa.pub authorized_keys  到每个结点即可
  • 1
  • 2
  • 3
  • 4

验证:可以之间ssh到其它服务器,不需要再输入密码。

4>sshpass

用于非交互的ssh 密码验证,它支持密码从命令行,文件,环境变量中读取。

功能命令备注
sshpass -p user_password ssh user_name@192.168.1.2登录远程机器-p 参数指定明文密码,-q 去掉进度显示
sshpass -p user_password ssh user_name@192.168.1.2 “pwd”登录远程主机并执行pwd命令。可以替换为其它命令
sshpass -p user_password scp -P22 root@192.168.1.2:/home/test ./远程机器/home/test 复制到本机当前目录 -P22端口22
sshpass -f user.passwd ssh user_name@192.168.1.2从文件读取密码echo "user_password" > user.passwd -f 文件
sshpass -e ssh user_name@192.168.1.2从环境变量获取密码export SSHPASS="user_password"

6)打包和压缩文件

4,安全

1)防火墙(firewall)

#查看firewall状态,LINUX7默认是安装并开启的;
firewall-cmd --state
systemctl status firewalld
#安装
yum install firewalld
#启动
systemctl start firewalld 
#设置开机启动
systemctl enable firewalld
#关闭,修改后reboot,执行firewall-cmd --state可确认状态
systemctl stop firewalld
#取消开机启动,修改后reboot,执行firewall-cmd --state可确认状态
systemctl disable firewalld
#重新加载配置文件,更改配置后一定要重新加载配置文件
firewall-cmd --reload
     
#查看防火墙规则(只显示/etc/firewalld/zones/public.xml中防火墙策略,在配置策略前,我一般喜欢先CP,以后方便直接还原)
firewall-cmd --list-all 
#查看所有的防火墙策略(即显示/etc/firewalld/zones/下的所有策略)
firewall-cmd --list-all-zones 
#查看开放的端口
firewall-cmd --list-ports

#禁止IP (123.44.55.66),执行成功后reload一下
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address="123.44.55.66" drop'
#禁止一个IP段,比如禁止116.255.*.* ,执行成功后reload一下
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address="116.255.0.0/16" drop'
#禁止一个IP段,比如禁止116.255.196.* ,执行成功后reload一下
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address="116.255.196.0/24" drop'
#开放ip访问,即ip可以访问所有端口
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.1.1.2" accept'
#禁止机器IP(123.44.55.66)这条规则从防火墙中删除
firewall-cmd --permanent --remove-rich-rule='rule family=ipv4 source address="123.44.55.66" drop'

#允许http服务(对应服务策略目录:/usr/lib/firewalld/services/)
firewall-cmd --permanent --add-service=http
#关闭http服务(对应服务策略目录:/usr/lib/firewalld/services/)
firewall-cmd --permanent --remove-service=http

#允许端口:3389
firewall-cmd --permanent --add-port=3389/tcp
#允许端口:1-3389
firewall-cmd --permanent --add-port=1-3389/tcp
#关闭放行中端口:3389
firewall-cmd --permanent --remove-port=3389/tcp
  • 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

2)iptables

1>nat表

NAT表,作用是对网络地址进行转换,主要有两个功能:1. DNAT 网络目的地址转换; 2. SNAT 网络源地址转换。

场景:
1.公司里有几台服务器需要对外提供服务,但公司只有一个外网ip地址,怎么让几台服务器共用一个ip地址?
2.家庭里很手机、电脑等设备,一般会通过wifi连到路由器上,然后上外网,仔细推敲下手机电脑获取的是路由器分配的内网ip,而内网ip是不能在外网里传播的,路由器是如何实现让多台设备冲浪的?

2>iptables概念

linux 系统自带的优秀且完全免费的基于包过滤的防火墙工具。可以对流入、流出及流经服务器的数据包进行精细的控制。

命令格式:

iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]

-t (table),后面接表名,例如nat或filter,缺省为预设的filter

##常用命令
-P 设置默认策略:iptables -P INPUT (DROP|ACCEPT)
-F 清空规则链;注意可能会导致服务器断开所有网络连接
-L look, 查看规则链
-A append, 在规则链的末尾加入新规则
-D num   delete,删除规则-->iptables -D INPUT 1(编号)
-R 修改replace规则-->iptables -R INPUT 1 -s 192.168.12.0 
-I num   insert,在规则链的头部加入新规则 iptables -I INPUT 1 --dport 80 -j ACCEPT 
-N 新的规则-->iptables -N allowed 定义新的规则
-j DROP 取代现行规则,顺序不变(1是位置)
## -j 指定要进行的处理动作:
DROP:丢弃
REJECT:明示拒绝
ACCEPT:接受
SNAT基于原地址的转换
source--指定原地址

## 常用参数
-p 匹配协议,如tcp udp icmp
-s 匹配源地址(ip、mask)  加叹号"!"表示除这个IP外。
-d 匹配目的地址 
-sport 匹配源端口 例:iptables -A INPUT -p tcp --sport 22
-dport 匹配目的端口 例:iptables -A INPUT -p tcp --dport 22
-i 指定入口网卡 例:iptables -A INPUT -i eth0
-o 指定出口网卡 例:iptables -A FORWARD -o eth0

##其他
-n 不进行ip鱼hostname的反查,显示讯息速度会快一点;
-v 列出更多信息,包括通过该规则的封包总位数,相关的网络接口等
  • 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
功能命令备注
删除自定义链iptables -X newchain
重命名链iptables -E newchain newchain2

对于不直接提供公网地址给用户访问的客户,一般服务器在企业防火墙后面,通常只暴露一个公网给用户。

举例:
后端服务器:192.168.31.167 8080端口提供服务;
公网服务器:192.168.31.168 80端口暴露给用户进行访问。

直接在宿主机上访问:192.168.31.167:8080,服务正常。
在公网服务器上添加DSAT转换规则:
iptables -t nat -A PREROUTING -d 192.168.31.168 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.31.167:8080

外网访问192.168.31.168 80端口,验证结果是否ok
curl 192.168.31.168 80
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

3)用户和群组

功能命令备注
创建一个新用户组groupadd group_name
删除一个用户组groupdel group_name
创建一个属于“admin”用户组的用户useradd -c “Name Surname” -g admin -d /home/user1 -s /bin/bash user1
创建一个新用户useradd user1
删除一个用户userdel -r user1
修改一个用户的口令(只允许root执行)passwd user1
列出所有用户以及密码cat /etc/passwd
查找某个用户cat /etc/passwdgrep 用户名
列出所有用户组cat /etc/group
查找某个组cat /etc/groupgrep 组名
查看当前登录用户的组内成员groups
查看test用户所在的组,以及组内成员groups test
查看当前登录用户whoami
历史访问用户列表who列从左到右:登录用户名、终端名、登录时间
查看系统所有用户lastlog
建立用户账号useradd
删除用户账号及相关文件userdel

4)chmod命令(文件权限)

运行时报错:-bash: ./test: Permission denied,需要修改访问权限,调用命令chmod 777 test
Linux/Unix 的文件调用权限分为三级 : 文件拥有者、群组、其他。利用 chmod 可以藉以控制文件如何被他人所调用。

chmod [-cfvR] [--help] [--version] mode file...

其中mode为权限设定字串,格式如:`[ugoa...][[+-=][rwxX]...][,...]`
其中:

    u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
    + 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
    r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。

其他参数说明:
    -c : 若该文件权限确实已经更改,才显示其更改动作
    -f : 若该文件权限无法被更改也不要显示错误讯息
    -v : 显示权限变更的详细资料
    -R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递回的方式逐个变更)
    --help : 显示辅助说明
    --version : 显示版本
举例:将文件 file1.txt 设为所有人皆可读取 :

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
chmod ugo+r file1.txt

## 用数字来表示权限 分别表示User、Group、及Other的权限
# 其中 r=4,w=2,x=1
# 若要rwx属性则4+2+1=7;
# 若要rw-属性则4+2=6;
# 若要r-x属性则4+1=5。
chmod 777 file1.txt  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

5)chown (修改用户或用户组)

chown [参数] [用户]:[用户组] [文件]

-R  递归更改目录所属的用户及用户组
  • 1
  • 2
  • 3

通过ll命令,可以看到:

# 第一个root指的是所属用户,第二个root指的是所属用户组
-rw-r--r--. 1 root root 4 Nov 17 23:29 test1.py
# 修改所属【用户】为mysql
chown -R mysql test1.py 
# 修改所属【用户组】为mysql
chown -R :mysql test1.py 
# 同时修改所属【用户】及【用户组】为mysql
chown -R mysql:mysql test1.py 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

5,网络

功能命令备注
查看主机ip地址和网卡信息ifconfig网卡配置文件路径:/etc/sysconfig/network-scripts
查看ipip addr
测试网络连通性ping
查看网络模式和网络速度ethtool
查看路由表route
查看主机名hostname
路由跟踪命令traceroute
查询dns相关信息记录dig
查看路由表route

1)netstat

netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告,另外它还能列出处于监听状态(即等待接入请求)的套接字。

netstat          显示连接信息,路由表

常用参数:
-a    all,列出所有当前的连接
-t    tcp,列出 TCP 协议的连接
-u    udp
-n    num, 禁用域名解析功能、只用数字展示,可以加扩查询速度
-l    listening 正在监听的连接  
-p    process 显示对应连接的PID/Program name  
	  查看端口是否监听:netstat -ntlp |grep 端口  
	  查看端口占用情况(监听的和被调用的都有) `netstat -anp|grep 80``ss -ntlp | grep 443` 
	  								第一列ip:port表示本地address;
	  								第二列ip:port表示外部访问它的foreign address; 
	  								最后一列为PID/Program name;
	  								倒数第二列为连接状态state:ESTABLISHED-已连接,一般address\foreign address成对出现
-c    continued  每隔一个固定时间,执行该netstat命令.
-e	  extend 显示扩展信息,例如uid等	
      查看进程拥有者  netstat -ltpe  
-r    route 显示路由信息
-s    statistics 按各个协议进行统计
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
连接状态说明
CLOSED无连接是活动的或正在进行
LISTEN服务器在等待进入呼叫
SYN_RECV一个连接请求已经到达,等待确认
SYN_SENT应用已经开始,打开一个连接
ESTABLISHED正常数据传输状态
FIN_WAIT1应用说它已经完成
FIN_WAIT2另一边已同意释放
ITMED_WAIT等待所有分组死掉
CLOSING两边同时尝试关闭
TIME_WAIT另一边已初始化一个释放
LAST_ACK等待所有分组死掉
功能命令备注
查看端口占用nnetstat –anogrep 端口
打印网络接口netstat -i-ie可以输出ifconfig,显示网卡列表
查看http,smtp 或 ntp 服务是否在运行`netstat -aplegrep ntp`
统计机器中网络连接各个状态个数`netstat -anawk '/^tcp/ {++S[$NF]} END {for (a in S) print a,S[a]} ’ netstat -ant
netstat -antpgrep 2181查看2181连接

2)curl命令

利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具。支持文件的上传和下载。

curl [option] [url]
  • 1
参数说明
-A/–user-agent 设置用户代理发送给服务器
-b/–cookie <name=string/file>cookie字符串或文件读取位置
-c/–cookie-jar 操作结束后把cookie写入到这个文件中
-C/–continue-at 断点续转
-D/–dump-header 把header信息写入到该文件中
-e/–referer来源网址
-f/–fail连接失败时不显示http错误
-o/–output把输出写到该文件中
-O/–remote-name把输出写到该文件中,保留远程文件的文件名
-r/–range 检索来自HTTP/1.1或FTP服务器字节范围
-s/–silent静音模式。不输出任何东西
-T/–upload-file 上传文件
-u/–user <user[:password]>设置服务器的用户和密码
-w/–write-out [format]什么输出完成后
-x/–proxy <host[:port]>在给定的端口上使用HTTP代理
-#/–progress-bar进度条显示当前的传送状态
-H请求头
-dPOST内容
-X请求协议
-k跳过ssl证书认证
示例:
上传:
curl -u 用户名:密码 -T  test.txt "https://af.cn/artifactory/document/test.txt"
  • 1

下载:

curl -u 用户名:密码 https://af.cn/artifactory/test.txt

curl ${HTTP_WWW_PATH} -o /opt/test.zip
  • 1
  • 2
  • 3

post访问:

curl -H "Content-Type: application/json" 
	-X POST 
	-d '{"user_id": "123", "coin":100, "success":1, "msg":"OK!" }' 
	"http://192.168.0.1:8001/test"
  • 1
  • 2
  • 3
  • 4

3)wget命令

wget ${HTTP_WWW} 
  • 1

4)tcpdump

过滤传递给指定端口的数据 。

tcpdump想要捕获发送给imap服务器的数据 , 可以使用下面的参数 , 默认端口是143 :

tcpdump -i any dst port 143  -l -s 0 -w -|strings
说明:
dst port 是目标端口 , 只获取发送的数据 , 不获取返回的数据
-l  是监听模式
-s 0 不限制大小
-|strings  传递给strings命令打印可以打印的字符
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

5)ntpdate(Network Time Protocol (NTP),同步更新互联网时间)

加入crontab:

echo "*/20 * * * * /usr/sbin/ntpdate -u ntp1.aliyun.com >/dev/null &" >> /var/spool/cron/root
  • 1
参数说明
-aKeyid 使用 Keyid 来认证全部数据包。
-b通过调用 settimeofday 子例程来增加时钟的时间。
-d指定调试方式。判断 ntpdate 命令会产生什么结果(不产生实际的结果)。结 果再现在屏幕上。这个标志使用无特权的端口。
-eAuthenticationDelay 指定延迟认证处理的时间秒数。
-kKeyFile 当不使用缺省值 /etc/ntp.keys 文件时,为包含密钥的文件指定一个不同的名称。 请参阅文件KeyFile的描述。
-oVersion 当轮询它的发出数据包时,指定使用的 NTP 版本实现。 Version 的值可以是 1,2,3。缺省值是 3。
-pSamples 指定从每个服务器获取的样本的数目。 Samples 的值在 1 和 8 之间,并包括 1 和 8。它的缺省值是 4。
-s指定日志操作 syslog 设施的使用,而不是使用标准输出。 当运行 ntpdate 命令和 cron命令时,它是很有用的。
-tTimeOut 指定等待响应的时间。给定 TimeOut 的值四舍五入为 0.2 秒的倍数。缺省值是 1 秒。
-u指定使用无特权的端口发送数据包。 当在一个对特权端口的输入流量进行阻拦的防火墙后是很有益的, 并希望在防火墙之外和主机同步。防火墙是一个系统或者计算机,它控制从外网对专用网的访问。
-v记录 ntpdate 的版本标识字符串
-q仅查询 - 不设置时钟。
-B使用 adjtime() 系统调用强制始终对时间进行压摆,即使测得的偏移大于 ±128 ms。默认值是,如果偏移量大于 ±128 毫秒,则使用 settimeofday() 步进时间。请注意,如果在这种情况下偏移量远大于 ±128 毫秒,则可能需要很长时间(小时)才能将时钟转换为正确的值。在此期间,不应使用主机来同步客户端。

6)服务和端口映射

vi /etc/services

文件格式:
service-name    port/protocol   [aliases..]  [#comment]
  • 1
  • 2
  • 3
  • 4

6,docker & k8s

docker常用命令:

功能命令备注
查看docker容器docker ps -a可以获得CONTAINER ID
查看docker镜像docker images
查看服务端口映射情况docker container port a7bced18020a(CONTAINER ID)
进入正在运行的容器docker exec -it containerName bash
查看容器docker ps加参数-a表示查看所有容器,-l 查看最后一个创建的容器,包含停止态的容器。
容器重命名docker rename old容器名 new容器名
删除容器docker rm $CONTAINER_ID
删除镜像docker rmi <imageID/ImageRepository:tag>
重启docker中的服务docker restart <containerID>如:docker restart serviceName
暂停容器docker pause
停止容器docker stop
启动容器docker start
进入对应容器ssh localhost -p 12345(容器映射端口号)
查看容器的IPdocker inspect --format='{{.NetworkSettings.IPAddress}}' $CONTAINER_ID
搜索镜像docker search nginx
下载镜像docker pull nginx官方源速度慢的话,可以指定国内的源:docker pull daocloud.io/nginx

k8s常用命令:kubernetes(k8s)

7,tomcat

功能命令
tomcat关闭/opt/…/bin/shell/stop-tomcat.sh
tomcat启动/opt/…/bin/shell/start-tomcat.sh
TOMCAT启动JVM内存大小设置/bin/catalina.sh中,JAVA_OPTS="-Xms2048m -Xmx2048m -Xmn1024m -Xss1024K -XX:PermSize=128m -XX:MaxPermSize=512m"' ,然后重启tomacat。-Xms 堆空间初始大小,-Xmx 堆空间最大数值,-Xmn 年轻代的堆大小,-Xss 每个线程堆大小。

8,JVM相关命令

1)jmap命令

功能命令备注
查看进程mapjmap 18093(PID)jmap -dump:format=b,file=filename pid 将dump打出来
查看进程内存统计jmap -histo:live PID

2)jstat命令

Eden区就是用来存放新创建的对象的,经过minor Gc之后,会把存活的对象放到其Survior区中,再经过几次minor Gc后存活的对象会被放到Old区。所以总体来说Eden总是会不断增长的,并不断的minor Gc,当然可以通过增大Eden区的大小来减少minor Gc的次数。Full Gc相对来说更影响程序的性能。因为其执行时程序会暂停。

jstat结果查看:

  1. fullGc次数一定少于ygc
  2. fgc和ygc频繁gc后,如果能释放内存说明是正常的。如果没有释放内存说明未达到gc效果,有问题。
  3. 当fgc和ygc都100%时说明有问题出现。
功能命令备注
查看进程stackjstack -l pid> output; vim output
查看JVM总GC统计jstat -gcutil PID 10001000表示每1000ms打印一次。 S0:幸存1区当前使用比例;S1:幸存2区当前使用比例;E:Eden区使用比例;O:老年代使用比例;M:元数据区使用比例;CCS:压缩使用比例;YGC:年轻代垃圾回收次数;FGC:老年代垃圾回收次数;FGCT:老年代垃圾回收消耗时间;GCT:垃圾回收消耗总时间
类加载统计jstat -class PIDLoaded:加载class的数量;Bytes:所占用空间大小;Unloaded:未加载数量;Bytes:未加载占用空间;Time:时间
编译统计jstat -compiler PIDCompiled:编译数量;Failed:失败数量; Invalid:不可用数量;Time:时间;FailedType:失败类型;FailedMethod:失败的方法
垃圾回收统计jstat -gc PIDS0C:第一个幸存区的大小;S1C:第二个幸存区的大小S0U:第一个幸存区的使用大小;S1U:第二个幸存区的使用大小;EC:Eden区的大小;EU:Eden区的使用大小;OC:老年代大小;OU:老年代使用大小;MC:方法区大小;MU:方法区使用大小;CCSC:压缩类空间大小;CCSU:压缩类空间使用大小;
堆内存统计jstat - gccapacity PIDNGCMN:新生代最小容量;NGCMX:新生代最大容量;NGC:当前新生代容量;OGCMN:老年代最小容量;OGCMX:老年代最大容量;OGC:当前老年代大小;MCMN:最小元数据容量;MCMX:最大元数据容量;MC:当前元数据空间大小;CCSMN:最小压缩类空间大小;CCSMX:最大压缩类空间大小;CCSC:当前压缩类空间大小
新生代垃圾回收统计jstat -gcnew PIDTT:对象在新生代存活的次数;MTT:对象在新生代存活的最大次数;DSS:期望的幸存区大小
新生代内存统计jstat -gcnewcapacity PIDS0CMX:最大幸存1区大小;S1CMX:最大幸存2区大小;ECMX:最大Eden区大小
老年代垃圾回收统计jstat -gcold PID
老年代内存统计jstat -gcoldcapacity PID
元数据空间统计jstat -gcmetacapacity PID
JVM编译方法统计jstat -printcompilation PIDCompiled:最近编译方法的数量;Size:最近编译方法的字节码数量;Type:最近编译方法的编译类型;Method:方法名标识。

3)jps命令(Java Virtual Machine Process Status Tool)

java 的每一个程序,均独占一个 java 虚拟机实例,且都是一个独立的进程。每个进程都有自己的 id,通过jps可以查看当前所有java进程的pid。通过 option 参数来参看进程的详细信息。
如果是查询容器里的pid,需要进入容器再执行该命令。

常见命令:

参数含义
默认显示 pid、应用程序 main class 类名
-q只显示 pid
-m显示 pid、应用程序 main class 类名 和 传递给main方法的参数,在嵌入式jvm上可能是null
-l显示 pid 和 应用程序 main class 的完整包名 或者 应用程序的 jar 路径
-v显示 pid 、应用程序 main class 类名 和 传递给 jvm 的参数

4)jinfo(Configuration Info for Java)

查看虚拟机配置参数信思,也可用于调整虚拟机的配置参数。

命令说明备注
jinfo -sysprops pid查看该进程的全部配置信息
jinfo -flag <具体参数> pid查看具体参数的值jinfo -flag MaxHeapSize 6 查看最大堆内存设置
jinfo -flag ±参数 pid布尔类型的进程参数修改修改是实时立即生效的,但并不是每个参数都支持修改,只有被标记 manageable的flag可以被实时修改。
jinfo -flag 参数名=参数值 pid非布尔类型的修改

打包

1)mvn命令

使用时需要引用maven包。

功能命令备注
install打包mvn clean install -Dmaven.test.skip=trueclean 清除之前的包; -Dmaven.test.skip=true 跳过测试代码
package打包mvn clean package -Dmaven.test.skip=true
激活profilemvn package –Prelease-P显示激活release,注意没有空格
不激活默认激活的profilemvn package –P !profileTest1
查看当前处于激活状态的profilemvn help:active-profiles
停止mvn
打印依赖树mvn dependency:tree用于排查依赖冲突

nginx

功能命令备注
启动nginx安装目录地址 -c nginx配置文件地址/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
停止杀进程或强制停止杀进程:ps -ef
重新加载配置/usr/local/nginx/sbin/nginx -s reload -c0.7.53 版本之前用 kill -HUP cat /usr/local/nginx/logs/nginx.pid 方法来重新加载配置

python

交互式编程:Python ,ctrl+Z退出。

# python
Python 2.7.5 (default, Nov 20 2015, 02:00:19)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print("1")
1
>>>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

脚本实编程:python test.py

shell脚本

1)脚本运行

①权限报错

运行时报错:-bash: ./test: Permission denied,需要修改访问权限,调用命令chmod 777 test

②source运行脚本

在当前bash环境下读取并执行FileName中的命令。该filename文件可以无"执行权限".

source FileName
  • 1
  • 该命令通常用命令“.”来替代。如:
 source .bash_profile
. .bash_profile两者等效。
  • 1
  • 2

场景:source(或点)命令通常用于重新执行刚修改的初始化文档。

③sh和bash运行脚本

在当前bash环境下读取并执行FileName中的命令。该filename文件可以无"执行权限"。

 sh FileName
 bash FileName
  • 1
  • 2
  • 两者在执行文件时的不同,是分别用自己的shell来跑文件。
  • sh使用“-n”选项进行shell脚本的语法检查,使用“-x”选项实现shell脚本逐条语句的跟踪,可以巧妙地利用shell的内置变量增强“-x”选项的输出信息等。
nohup

nohup 命令忽略所有挂断(SIGHUP)信号,用于脚本的后台执行。
如果不将 nohup 命令的输出重定向,输出将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。

nohup shell test.sh > nohup.out 2>&1 &     要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部。
nohup python -u test.py > nohup.out 2>&1 &    python的输出有缓冲,导致nohup.out并不能够马上看到输出,需要添加-u参数。
  • 1
  • 2

④./运行脚本

打开一个子shell来读取并执行FileName中命令。

./FileName
  • 1
  • 运行一个shell脚本时会启动另一个命令解释器.
  • 每个shell脚本有效地运行在父shell(parent shell)的一个子进程里。这个父shell是指在一个控制终端或在一个xterm窗口中给你命令指示符的进程.
  • shell脚本也可以启动他自已的子进程。这些子shell(即子进程)使脚本并行地,有效率地地同时运行脚本内的多个子任务。

⑤脚本格式

linux只能执行格式为unix格式的脚本。否则会有如下报错:

-bash: ./test.sh: /bin/bash^M: bad interpreter: No such file or directory  
  • 1

IDEA中,可以修改格式为LF即可,如图片所示:
在这里插入图片描述

⑥包含外部脚本

和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。

#!/bin/bash

#使用 . 号来引用test1.sh 文件
. ./test1.sh

# 或者使用以下包含文件代码
# source ./test1.sh
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Linux中格式查看

vi打开脚本,在vi命令模式中使用 :set ff 命令,可以看到该文件的格式。
dos格式是有问题的,如下:

fileformat=dos
  • 1

我们需要修改脚本格式为unix,命令:set ff=unix
再通过 :set ff 命令查看格式,为unix即可。
或者直接将脚本格式进行转换:dos2unix test.sh

2) Linux下获取当前的目录

$(cd `dirname $0`;pwd)  
  • 1

dirname $0,取得当前执行的脚本文件的父目录;cd dirname $0,进入这个目录(切换当前工作目录);pwd,显示当前工作目录(cd执行后的)。

在使用的过程中需注意此事项:
命令中“`”不是英文的单引号,而是英文输入法下的“~”同一个按键下面的那个符号。

3)脚本开头和结束

程序必须以下面的行开始(第一行):

#!/bin/sh   
  • 1

#!用来告诉系统它后面的参数是用来执行该文件的程序。

退出程序:

exit 1; 
  • 1

4)注释

以#开头。

5)变量

  1. 使用不需要声明
  2. 所有的变量都由字符串组成
a=”hello world”
  • 1

6)输入输出

①输出echo

echo “A is:”
#输出变量a的值,为了便于区分可以用花括号
echo $a
echo "A is ${a}"
  • 1
  • 2
  • 3
  • 4

通过cat进行字串拼接并追加到文件结尾:

echo "net.ipv4.ip_local_ports=18080,`cat /proc/ip_local_ports`" >> test.conf
  • 1

②输入read

提示用户输入,并将输入赋值给变量:

read var
  • 1

7)环境变量

由export关键字处理过的变量叫做环境变量。我们不对环境变量进行讨论,因为通常情况下仅仅在登录脚本中使用环境变量。

8)Shell命令和流程控制

在shell脚本中可以使用三类命令:

i> Unix 命令

虽然在shell脚本中可以使用任意的unix命令,但是还是有一些相对更常用的命令。这些命令通常是用来进行文件和文字操作的。

ii> 管道, 重定向和 backtick

  1. 管道(|)—–将一个命令的输出作为另外一个命令的输入。
./install.sh > output 2>&1 | tailf output
  • 1
  1. 重定向—–将命令的结果输出到文件,而不是标准输出(屏幕)。
  > 写入文件并覆盖旧文件
    >> 加到文件的尾部,保留旧文件内容。
    反短斜线- 使用反短斜线可以将一个命令的输出作为另外一个命令的一个命令行参数。
  • 1
  • 2
  • 3

iii> 流程控制

①if
if ….; then
….
elif ….; then
….
else
….
fi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
②条件测试

通常用 [ ] 来表示条件测试。注意这里的空格很重要。要确保方括号的空格。

[ -f “somefile” ] :判断是否是一个文件
[ -x “/bin/ls” ] :判断/bin/ls是否存在并有可执行权限
[ -n “$var” ] :判断$var变量是否有值
[ “$a” = “$b” ] :判断$a和$b是否相等
  • 1
  • 2
  • 3
  • 4
a. 算术比较
操作符描述举例
-eq=[ $var -eq 0 ] # 当 $var 等于 0 时,返回真
-ne不等于[ $var -ne 0 ] # 当 $var 不等于 0 时,返回真
-gt大于
-lt小于
-ge大于或等于
-le小于或等于
b. 逻辑运算符
操作符描述举例
-a (and) 或者 &&逻辑与[ -f “/etc/shadow” ] && echo “This computer uses shadow passwors”
-o (or) 或者``
c. 文件属性
操作符意义
[ -f $file_var ]变量 $file_var 是一个正常的文件名 (file),则返回真
[ -x $var ]变量 $var 包含的文件可执行 (execute),则返回真
[ -d $var ]变量 $var 包含的文件是目录 (directory),则返回真
[ -e $var ]变量 $var 包含的文件存在 (exist),则返回真
[ -c $var ]变量 $var 包含的文件是一个字符设备文件的路径 (character),则返回真
[ -b $var ]变量 $var 包含的文件是一个块设备文件的路径 (block),则返回真
[ -w $var ]变量 $var 包含的文件可写(write),则返回真
[ -r $var ]变量 $var 包含的文件可读 (read),则返回真
[ -L $var ]变量 $var 包含是一个符号链接 (link),则返回真
d.字符串比较

在进行字符串比较时,最好使用双中括号 [[ ]]. 因为单中括号可能会导致一些错误,因此最好避开它们。
检查两个字符串是否相同:

[[ $str1 = $str2 ]]
  • 1
③case

表达式可以用来匹配一个给定的字符串,而不是数字。

case … in
…) do something here ;;
esac
  • 1
  • 2
  • 3

举例:smartzip的脚本,该脚本可以自动解压bzip2, gzip 和zip 类型的压缩文件:

#!/bin/sh
ftype=`file “$1″`
case “$ftype” in
“$1: Zip archive”*)
unzip “$1” ;;
“$1: gzip compressed”*)
gunzip “$1” ;;
“$1: bzip2 compressed”*)
bunzip2 “$1” ;;
*) echo “File $1 can not be uncompressed with smartzip”;;
esac
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

您可能注意到我们在这里使用了一个特殊的变量$1。该变量包含了传递给该程序的第一个参数值。
也就是说,当我们运行:
smartzip articles.zip
$1 就是字符串 articles.zip

④selsect

select 表达式是一种bash的扩展应用,尤其擅长于交互式使用。用户可以从一组不同的值中进行选择。

select var in … ; do
break
done
…. now $var can be used ….
  • 1
  • 2
  • 3
  • 4

举例:
#!/bin/sh

echo “What is your favourite OS?”
select var in “Linux” “Gnu Hurd” “Free BSD” “Other”; do
break
done
echo “You have selected $var”
  • 1
  • 2
  • 3
  • 4
  • 5

下面是该脚本运行的结果:

What is your favourite OS?
1) Linux
2) Gnu Hurd
3) Free BSD
4) Other
#? 1
You have selected Linux
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
⑤loop
  1. while-loop 将运行直到表达式测试为真。
    关键字”break” 用来跳出循环。而关键字”continue”用来不执行余下的部分而直接跳到下一个循环。
while …; do
….
done
  • 1
  • 2
  • 3
  1. for-loop表达式查看一个字符串列表 (字符串用空格分隔) 然后将其赋给一个变量:
for var in ….; do
….
done
  • 1
  • 2
  • 3

9)引号

在向程序传递任何参数之前,程序会扩展通配符和变量。这里所谓扩展的意思是程序会把通配符(比如*)替换成合适的文件名,它变量替换成变量值。为了防止程序作这种替换,您可以使用引号:让我们来看一个例子,假设在当前目录下有一些文件,两个jpg文件, mail.jpg 和tux.jpg。

10)计算

shell中不支持像普通c语言中的i++操作,默认都是字符串操作。

1>算术运算

i=0 
let i +=1  或者 let ‘i+=1
  • 1
  • 2

let也可以用 (())替代:
for 循环中用法:((for i=0;i<2;i++))
linux 中也可以用expr : i=expr $i + 1;
还可以用如下模式 :

 i=$[$i+1];
        i=$(( $i + 1 ))
  • 1
  • 2

GCC

GCC可以用来编译C/C++、FORTRAN、JAVA、OBJC、ADA等语言的程序,可根据需要选择安装支持的语言。
下载gcc后可以编译运行许多程序,常见命令:

#编译
make
  • 1
  • 2

装系统

1)设置时区

在这里插入图片描述

2)网卡设置

在这里插入图片描述

vi /etc/sysconfig/network-scripts/ifcfg-ens192
service network restart
  • 1
  • 2

3)磁盘挂载

在这里插入图片描述
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/155369
推荐阅读
相关标签
  

闽ICP备14008679号