Linux 命令大全
https://www.runoob.com/linux/linux-command-manual.html
Linux下打印ASCII字符
shell
[root@untifa_80 ~]# printf "\x30\n"
0
[root@untifa_80 ~]# echo -e "\u0030"
0
tar、gzip 打包解压命令
参考文章:tar命令打包解压示例
命令格式:
tar 必要参数 [选择参数] 文件名
必要参数 | 说明 |
---|---|
-A | 新增压缩文件到已存在的压缩 |
-B | 设置区块大小 |
-c | 建立新的压缩文件 |
-d | 记录文件的差别 |
-r | 添加文件到已经压缩的文件 |
-u | 添加改变了和现有的文件到已经存在的压缩文件 |
-x | 从压缩的文件中提取文件 |
-t | 显示压缩文件的内容 |
-z | 支持gzip解压文件 |
-j | 支持bzip2解压文件 |
-Z | 支持compress解压文件 |
-v | 显示操作过程 |
-l | 文件系统边界设置 |
-k | 保留原有文件不覆盖 |
-m | 保留文件不被覆盖 |
-W | 确认压缩文件的正确性 |
选择参数 | 说明 |
---|---|
-b | 设置区块数目 |
-C | 切换到指定目录 |
-f | 指定压缩文件 |
--help | 显示帮助信息 |
--version | 显示版本信息 |
常见解压/压缩命令:
text
tar文件格式
解包:tar xvf FileName.tar
打包:tar cvf FileName.tar DirName
(注:tar是打包,不是压缩!)
.gz文件格式
解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz
压缩:gzip FileName
.tar.gz 和 .tgz
解压:tar zxvf FileName.tar.gz
压缩:tar zcvf FileName.tar.gz DirName
.bz2文件格式
解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩: bzip2 -z FileName
.tar.bz2文件格式
解压:tar jxvf FileName.tar.bz2
压缩:tar jcvf FileName.tar.bz2 DirName
.bz文件格式
解压1:bzip2 -d FileName.bz
解压2:bunzip2 FileName.bz
压缩:未知
.tar.bz文件格式
解压:tar jxvf FileName.tar.bz
压缩:未知
.Z文件格式
解压:uncompress FileName.Z
压缩:compress FileName
.tar.Z文件格式
解压:tar Zxvf FileName.tar.Z
压缩:tar Zcvf FileName.tar.Z DirName
.zip文件格式
解压:unzip FileName.zip
压缩:zip FileName.zip DirName
.rar
解压:rar x FileName.rar
压缩:rar a FileName.rar DirName
实例1:将文件全部打包成tar包
shell
tar -cvf log1.tar log1.log
tar -zcvf log2.tar.gz log2.log
tar -jcvf log3.tar.bz2 log3.log
说明:
tar -cvf log1.tar log1.log 仅打包,不压缩!
tar -zcvf log2.tar.gz log2.log 打包后,以 gzip 压缩
tar -jcvf log.tar.bz2 log3.log 打包后,以 bzip2 压缩
在参数 f 之后的文件档名是自己取的,我们习惯上都用 .tar 来作为辨识。 如果加 z 参数,则以 .tar.gz 或 .tgz 来代表 gzip 压缩过的 tar 包; 如果加 j 参数,则以 .tar.bz2 来作为tar包名。
实例2:查阅上述 tar包内有哪些文件
shell
tar -ztvf log2.tar.gz
说明:由于我们使用 gzip 压缩的log.tar.gz,所以要查阅log.tar.gz包内的文件时,就得要加上 z 这个参数了
实例3:将 .tar.gz 包解压缩
shell
tar -zxvf /home/yiibai/log2.tar.gz
说明:在预设的情况下,我们可以将压缩档在任何地方解开的
实例4:只将 /tar 内的 部分文件解压出来
shell
tar -zxvf /home/yiibai/mylog.tar.gz log2020.log
说明:可以通过 tar -ztvf 来查阅 tar 包内的文件名称,如果单只要一个文件,就可以透过这个方式来解压部分文件!
实例5:文件备份下来,并且保存其权限
shell
tar -zcvf log20.tar.gz log2018.log log2019.log
tar -zxvpf /home/yiibai/log20.tar.gz
说明:这个 -p 的属性是很重要的,尤其是当您要保留原本文件的属性时
实例6:在文件夹当中,比某个日期新的文件才备份
shell
tar -N "2017/11/13" -zcvf log17.tar.gz /home/yiibai
实例7:备份文件夹内容是排除部分文件
shell
tar --exclude project/service -zcvf project.tar.gz project/*
实例8:将某个文件解压到指定目录
shell
tar -ztvf target.202411281430.tar.gz |grep CdBusiMain.tables.xml
tar -zxvf target.202411281430.tar.gz target/config/busi/cd/src/main/resources/tables/card/CdBusiMain.tables.xml -C /home/hxapp/user/ft/test/
说明:指定文件要带在压缩包里的路径,-C 后面接指定目录,将打包的目录层级压缩到指定目录,而不只是这个文件
iconv 文件编码格式转换
将GBK编码文件转换为UTF-8格式
shell
iconv -f gbk -t utf-8 xeglf_accinfo.txt > xeglf_accinfo_conv.txt
FTP
mget时,取消提示信息命令:prompt off;
打开提示信息命令:prompt on;
ftp 不支持绝对路径上传
lcd 更改本地目录
!ls 查看本地目录内容
sed 命令
shell
sed -e "/^[[:space:]]*$/d" -e "s/.SQC/ /g" -e "s/^/'/g" -e "s/ /',/" WORKUNIT.list.bak > WORKUNIT.list
其中:"/^[[:space:]]*$/d" 代表空行
s/.SQC/ /g 代表.SQC替换为空格
多个替换之间用空格分开 用 -e 连接 后面接文件名(被替换的文件)
> 为标准输出
文件名(生成的新文件)
查看tmp.txt文件中的第x行
shell
sed -n "xp" tmp.txt
查看tmp.txt文件中的第a-b行
shell
sed -n "a,bp" tmp.txt
替换文件1中的n-m行并重新写入文件2中:
shell
sed 'n,m s/$1/$2/g' 文件名1>文件名2
将文件1中所有的$1替换为$2并重新写入文件2中:
shell
sed 's/$1/$2/g' 文件名1>文件名2
将文件1中的$1替换为$2,再将$3替换为$4并重新写入文件2中:
shell
sed -e 's/$1/$2/g' -e '/s/$3/$4/g' 文件名1>文件名2
将文件1中的$1替换为回车并重新写入文件2中:
shell
sed 's/$1/\
/g' 文件名1>文件名2
shell 中写while循环
读filename的每一行 然后执行 echo $line
shell
while read line
do
echo $line
done < filename
crontab -e 创建定时任务
f1 f2 f3 f4 f5 program
f1表示分钟(0-59)
f2表示小时(0-23)
f3表示第几日(1-31)
f4表示第几月(1-12)
f5表示星期几(0-6 0为星期天)
program表示要执行的程序
当参数(f1-f5)为时,表示每(分钟/小时/天/月/星期几)都要执行program
当参数(f1-f5)为a-b时,表示从第a(分钟/小时/日/月/星期)-第b(分钟/小时/日/月/星期)这段时间内要执行program
当参数(f1-f5)为 /n时,表示每n(分钟/小时/日/月)执行program当参数(f1-f5)为a,b,c时,表示第a,b,c(分钟/小时/日/月/星期)要执行program
使用者也可以将所有设定存放在file中 用crontab file的方式来设定时间表
文件内容进行大小写转换
shell
命令模式下:
小写转为大写
:%s/[a-z]/\U&/g
将大写字母替换为小写字母:
:%s/[A-Z]/\L&/g
或
cat 文件名 | tr "[:upper:]" "[:lower:]" > 目标文件名
if 判断
文件比较运算符 | 例子 |
---|---|
-e filename 如果 filename存在,则为真 | [ -e /var/log/syslog ] |
-d filename 如果 filename为目录,则为真 | [ -d /tmp/mydir ] |
-f filename 如果 filename为常规文件,则为真 | [ -f /usr/bin/grep ] |
-L filename 如果 filename为符号链接,则为真 | [ -L /usr/bin/grep ] |
-r filename 如果 filename可读,则为真 | [ -r /var/log/syslog ] |
-w filename 如果 filename可写,则为真 | [ -w /var/mytmp.txt ] |
-x filename 如果 filename可执行,则为真 | [ -x /usr/bin/grep ] |
filename1 -nt filename2 如果 filename1比 filename2新,则为真 | [ /tmp/install/etc/services -nt /etc/services ] |
filename1 -ot filename2 如果 filename1比 filename2旧,则为真 | [ /boot/bzImage -ot arch/i386/boot/bzImage ] |
例子:
1.判断文件是否存在
shell
if [ -e filename ]
then
...存在做...
else
...不存在做...
fi
2.判断目录是否存在
shell
if [ -d dirname ]
then
...存在做...
else
...不存在做...
fi
字符串比较运算符(字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)) | 例子 |
---|---|
-z string 如果 string长度为零,则为真 | [ -z "$myvar" ] |
-n string 如果 string长度非零,则为真 | [ -n "$myvar" ] |
string1 = string2 如果 string1与 string2相同,则为真 | [ "$myvar" = "one two three" ] |
string1 != string2 如果 string1与 string2不同,则为真 | [ "$myvar" != "one two three" ] |
数字比较运算符 | 例子 |
---|---|
num1 -eq num2 等于 | [ 3 -eq $mynum ] |
num1 -ne num2 不等于 | [ 3 -ne $mynum ] |
num1 -lt num2 小于 | [ 3 -lt $mynum ] |
num1 -le num2 小于或等于 | [ 3 -le $mynum ] |
num1 -gt num2 大于 | [ 3 -gt $mynum ] |
num1 -ge num2 大于或等于 | [ 3 -ge $mynum ] |
expr
expr:
$LOOP=0
$LOOP=expr $LOOP + 1
echo
ANSI控制码的说明:
-n 不输出换行符
-e 打开反斜杠ESC转义
-E 取消反斜杠ESC转义 (默认)
--help 显示帮助
--version 显示版本
linux的echo命令,在shell编程中极为常用,在终端下打印变量value的时候也是常常用到的,因此有必要了解下echo的用法.
echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用。
该命令的一般格式为:
echo [ -n ] 字符串 其中选项 n 表示输出文字后不换行;字符串能加引号,也能不加引号。
用echo命令输出加引号的字符串时,将字符串原样输出;
用echo命令输出不加引号的字符串时,将字符串中的各个单词作为字符串输出,各字符串之间用一个空格分割。
功能说明:显示文字。
语法:echo [-ne][字符串]
或echo [--help][--version]补充说明:
echo会将输入的字符串送往标准输出。
输出的字符串间以空白字符隔开,并在最后加上换行号。
参数:-n 不要在最后自动换行
设置颜色:
语法:
echo -e \033[背景色\033[前景色\033[高亮m 内容 \033[0m
参数:
\033[0m 关闭所有属性
\033[1m 设置高亮度
\033[4m 下划线
\033[5m 闪烁
\033[7m 反显
\033[8m 消隐
\033[30m -- \033[37m 设置前景色
\033[40m -- \033[47m 设置背景色
\033[nA 光标上移n行
\033[nB 光标下移n行
\033[nC 光标右移n行
\033[nD 光标左移n行
\033[y;xH 设置光标位置
\033[2J 清屏
\033[K 清除从光标到行尾的内容
\033[s 保存光标位置
\033[u 恢复光标位置
\033[?25l 隐藏光标
\033[?25h 显示光标
例子:
shell
echo -e "\033[31m红色文本\033[0m"
echo -e "\033[32m绿色文本\033[0m"
echo -e "\033[33m黄色文本\033[0m"
tee命令
格式:tee只输出到标准输出,因为没有指定文件
格式:tee file
输出到标准输出的同时,保存到文件file中。如果文件不存在,则创建;如果已经存在,则覆盖之
格式:tee -a file
输出到标准输出的同时,追加到文件file中。如果文件不存在,则创建;如果已经存在,就在末尾追加内容,而不是覆盖
格式:tee -
输出到标准输出两次
格式:tee file1 file2 -
输出到标准输出两次,同时保存到file1和file2中
如果我们同时想把一个命令的输出既转到一个文件又转给另一个命令作为输入 可以用tee命令 他会把输入内容同时复制到标准输出和一个文件
exit与return的区别
- 作用不同。exit用于在程序运行的过程中随时结束程序,exit的参数是返回给OS的。exit是结束一个进程,它将删除进程使用的内存空间,同时把错误信息返回父进程。而return是返回函数值并退出函数;
- 语义层级不同。return是语言级别的,它表示了调用堆栈的返回;而exit是系统调用级别的,它表示了一个进程的结束;
- 使用方法不用。return一般用在函数方法体内,exit可以出现在Shell脚本中的任意位置;
find 命令
查询空文件
shell
find . -name "k*" -type f -size 0c
eval 命令
Linux中命令行中EOF的用法
EOF是end of file的缩写,表示文件的结尾,是文件结束的标识符。EOF是自定义的标识符,即EOF并不是规定的,可以设置别名,即可以用任意字符串进行表示。
起始的<<EOF,在<<与EOF之间不能有空格,结尾的EOF必须顶格写,并且EOF后面不能有空格。
shell
<<EOF
...
...
...
EOF
# 或者自定义标识符
<<AAA
...
...
...
AAA
例子:
将起始符和终止符之间的内容输入到文件1中
shell
cat > 1 <<EOF
> 1
> 2
> 3
> 4
> 5
> 6
> EOF
case...esac 使用举例
shell
while :
do
echo -n "Please enter a nummber or letter: "
read c
case $c in
0|1|2|3|4|5|6|7|8|9)
echo "You entered a nammber:$c"
;;
a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z)
echo "You entered a lowercase letter: $c. Contine."
;;
A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z)
echo "You entered a capital letter:$c. Contine."
;;
*)
echo "You entered another character:$c \nGame over!"
break;
;;
esac
done
awk 之 NR、NF、FNR、RS、ORS、FILENAME、ARGC和ARGV
awk变量详解、常用内置变量、用户自定义变量、内置变量
"变量"分为"内置变量"和"自定义变量"。 "输入分隔符 FS"和"输出分隔符 OFS"是内置变量。
内置变量和自定义变量都不像shell那样使用"$",而是直接使用变量名。
1.txt
text
1-1 1-1
1-2 1-2
1-3 1-3
1-4 1-4
1-5 1-5
1-6 1-6
2.txt
text
2-1 2-1
2-2 2-2
2-3 2-3
2-4 2-4
2-5 2-5
2-6 2-6
2-7 2-7
内置变量是awk中的预定义和内置变量,用户定义的变量是用户定义的变量。
常用内置变量:
-
FS
输入字段分隔符,默认为空白字符
shell# 按照分隔符为空格拆分每行,打印第一个变量 awk 'FS=" " {print NR,$1}' 1.txt
-
OFS
输出字段分隔符,默认为空白
shellawk 'OFS="###---### " {print NR,$1,$2}' 1.txt
-
RS
Enter record separator(Enter line feed),指定输入时的换行符
shell# 以空格为指定分隔符 awk -v RS=' ' '{print NR,$1,$2}' 1.txt
-
ORS
输出记录分隔符(输出换行符)。输出时,用指定符号替换换行符
shellawk -v ORS=',\n' '{print NR,$1,$2}' 1.txt
-
NF
number of Field,当前行的字段数(即当前行分为几列),字段数
shellawk '{print NF,$0}' 1.txt 2.txt
-
NR
行号:当前处理的文本行的行号。
shellawk '{print NR,$0}' 1.txt 2.txt
-
FNR
单独计算每个文档的行号
shellawk '{print FNR,$0}' 1.txt 2.txt
-
FILENAME
当前文件名
-
ARGC
命令行参数个数
shellawk 'BEGIN{print "参数:>>>",ARGV[0],ARGV[1],ARGV[2],ARGC}' 1.txt 2.txt
-
ARGV
数组,保存命令行给的参数
ARGV 内置变量表示一个数组。由于是数组,所以需要使用上图中的下标来引用对应元素的值。
ARGV[0] 对应第一个参数,即awk命令本身。 awk指定'pattern {action}'不作为参数,awk作为参数。
shellawk 'BEGIN{print "参数:>>>",ARGV[0],ARGV[1],ARGV[2]}' 1.txt 2.txt
PS1
PS1:定义系统提示符的变量
shell脚本中特殊符号的含义($$、$?...)
shell
func1(){
echo "\$0>>>>>>:"$0
pwd &
sleep 1
echo "\$!>>>>>>:"$!
echo "\$\$>>>>>>:"$$
echo "\$->>>>>>:"$-
echo "ls 111"
ls 111
echo "\$?>>>>>>:"$?
echo "ls test1.sh"
ls test1.sh
echo "\$?>>>>>>:"$?
echo "\$#>>>>>>:"$#
echo "\$@>>>>>>:"$@
echo "\$*>>>>>>:"$*
echo "\$_>>>>>>:"$_
}
main(){
func1 ni hao wo you yi ge mao shan;
}
main
-
shell脚本本身的pid(ProcessID)
shell脚本最后运行的后台命令的processID - $?
shell脚本执行的命令的返回状态,0为成功 - \* 在一个变量中列出所有的参数,各个参数之间用环境变量IFS中的第一个字符分隔开。如果IFS为空,所有参数将会挤在一块如一个字符串的形式。如果IFS被修改了,那么*将命令行分隔为参数的方式就将随之改变。(环境变量IFS,称为内部字段分隔符(internal field separator),定义了bash shell用作字段分隔符的一系列字符。默认情况下,bash shell会将下列字符当做字段分隔符:空格、制表符、换行符)
- @ 是*的一种变体,它不使用IFS环境变量,所以即使IFS为空,参数也不会挤在一起
- $#
传递到脚本的参数个数 - $0
Shell脚本本身的文件名 - 1\~n
执行shell脚本的参数1 ~ 参数n - $-
使用Set命令设定的Flag一览,
可查看是否属于交互模式
- $_
在shell启动时,在交互式shell里设置全路径名,在脚本里传递传递环境变量和参数列表。
随后,将前面一个命令的最后一个参数扩展
Shell变量详解
Linux工作中常用的命令netstat、lsof、ps
netstat
netstat 是一款命令行工具,主要是用于列出系统上所有的网络套接字连接情况,包括 tcp, udp 以及 unix 套接字,另外它还能列出处于监听状态(即等待接入请求)的套接字。除此之外,netstat 命令还可用于显示路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等。
一个正常的TCP连接,都会有三个阶段:1、TCP三次握手;2、数据传送;3、TCP四次挥手
如图:
1:SYN:(同步序列编号,Synchronize Sequence Numbers)该标志仅在三次握手建立TCP连接时有效。表示一个新的TCP连接请求。
2:ACK:(确认编号,Acknowledgement Number)是对TCP请求的确认标志,同时提示对端系统已经成功接收所有数据。
3:FIN:(结束标志,FINish)用来结束一个TCP回话.但对应端口仍处于开放状态,准备接收后续数据。
4:LISTEN:首先服务端需要打开一个socket进行监听,状态为LISTEN, The socket is listening for incoming connections. 侦听来自远方TCP端口的连接请求 。
5:SYN_SENT:客户端通过应用程序调用connect进行active open.于是客户端tcp发送一个SYN以请求建立一个连接,之后状态置为SYN_SENT,The socket is actively attempting to establish a connection. 在发送连接请求后等待匹配的连接请求。
6:SYN_RECV:服务端应发出ACK确认客户端的SYN,同时自己向客户端发送一个SYN, 之后状态置为SYN_RECV ,
A connection request has been received from the network. 在收到和发送一个连接请求后等待对连接请求的确认 。
7:ESTABLISHED:代表一个打开的连接,双方可以进行或已经在数据交互了, The socket has an established connection. 代表一个打开的连接,数据可以传送给用户。
8:FIN_WAIT1:主动关闭(active close)端应用程序调用close,于是其TCP发出FIN请求主动关闭连接,之后进入FIN_WAIT1状态。 The socket is closed, and the connection is shutting down. 等待远程TCP的连接中断请求,或先前的连接中断请求的确认。
9:CLOSE_WAIT:被动关闭(passive close)端TCP接到FIN后,就发出ACK以回应FIN请求(它的接收也作为文件结束符传递给上层应用程序),并进入CLOSE_WAIT, The remote end has shut down, waiting for the socket to close. 等待从本地用户发来的连接中断请求 。
10:FIN_WAIT2:主动关闭端接到ACK后,就进入了FIN-WAIT-2 , Connection is closed, and the socket is waiting for a shutdown from the remote end. 从远程TCP等待连接中断请求。
11:LAST_ACK:被动关闭端一段时间后,接收到文件结束符的应用程序将调用CLOSE关闭连接。这导致它的TCP也发送一个 FIN,等待对方的ACK.就进入了LAST-ACK , The remote end has shut down, and the socket is closed. Waiting for acknowledgement. 等待原来发向远程TCP的连接中断请求的确认。
12:TIME_WAIT:在主动关闭端接收到FIN后,TCP就发送ACK包,并进入TIME-WAIT状态。 The socket is waiting after close to handle packets still in the network.等待足够的时间以确保远程TCP接收到连接中断请求的确认。
13:CLOSING:比较少见, Both sockets are shut down but we still don't have all our data sent. 等待远程TCP对连接中断的确认。
14:CLOSED: 被动关闭端在接受到ACK包后,就进入了closed的状态。连接结束, The socket is not being used. 没有任何连接状态。
15:TIME_WAIT状态的形成只发生在主动关闭连接的一方。主动关闭方在接收到被动关闭方的FIN请求后,发送成功给对方一个ACK后,将自己的状态由FIN_WAIT2修改为TIME_WAIT,而必须再等2倍 的MSL(Maximum Segment Lifetime,MSL是一个数据报在internetwork中能存在的时间)时间之后双方才能把状态 都改为CLOSED以关闭连接。目前RHEL里保持TIME_WAIT状态的时间为60秒。
安装
shell
yum install net-tools -y
参数
参数 | 解释 |
---|---|
-a或--all | 显示所有连线中的Socket; |
-A<网络类型>或--<网络类型> | 列出该网络类型连线中的相关地址; |
-c或--continuous | 持续列出网络状态; |
-C或--cache | 显示路由器配置的快取信息; |
-e或--extend | 显示网络其他相关信息; |
-F或--fib | 显示FIB; |
-g或--groups | 显示多重广播功能群组组员名单; |
-h或--help | 在线帮助; |
-i或--interfaces | 显示网络界面信息表单; |
-l或--listening | 显示监控中的服务器的Socket; |
-M或--masquerade | 显示伪装的网络连线; |
-n或--numeric | 直接使用ip地址,而不通过域名服务器; |
-N或--netlink或--symbolic | 显示网络硬件外围设备的符号连接名称; |
-o或--timers | 显示计时器; |
-p或--programs | 显示正在使用Socket的程序识别码和程序名称; |
-r或--route | 显示Routing Table; |
-s或--statistice | 显示网络工作信息统计表; |
-t或--tcp | 显示TCP传输协议的连线状况; |
-u或--udp | 显示UDP传输协议的连线状况; |
-v或--verbose | 显示指令执行过程; |
-V或--version | 显示版本信息; |
-w或--raw | 显示RAW传输协议的连线状况; |
-x或--unix | 此参数的效果和指定"-A unix"参数相同; |
--ip或--inet | 此参数的效果和指定"-A inet"参数相同。 |
使用方法:
1: Active Internet connections
有源TCP连接,UDP连接。
shell
netstat -tnp | more
shell
netstat -anplt
Proto:协议名(tcp协议还是udp协议)
Local Address(本地地址):
代表:这个字段显示了网络连接的本地端点的IP地址和端口号。换句话说,它表示你的机器上某个网络服务或应用程序正在监听或已经建立的连接的本地接口和端口。
作用:通过查看本地地址,你可以知道哪些本地端口正在被使用,以及哪些服务正在运行。这有助于识别可能的端口冲突、了解服务配置是否正确,或者定位可能的安全风险。
Foreign Address(外部地址):
代表:这个字段显示了远程主机(即外部设备或服务器)的IP地址和端口号,表示与你的机器建立连接的对端。
作用:外部地址可以帮助你了解哪些远程主机正在与你的机器进行通信。这对于监控网络流量、识别未经授权的访问尝试、诊断连接问题或评估网络安全状况非常有用。
比如以下我启动的hadoop服务中的Local Address显示为127.0.0.1:50070,这通常意味着相应的服务只绑定在了本地回环地址(loopback address)上。在这种情况下,外部客户端(即不在同一台机器上的客户端)将无法直接访问该端口,因为这个地址只允许本机上的进程进行通信。如果你希望外部客户端能够访问该服务,你需要将服务配置为绑定到机器的外部IP地址上,或者绑定到0.0.0.0,这表示接受任何IPv4地址的连接(即监听所有网络接口)。
Foreign Address该值通常为0.0.0.0:,这通常表示本地服务正在某个端口上监听来自任何远程地址和端口的连接。这种情况通常出现在服务器应用程序上,它们等待并接受来自客户端的传入连接。
请注意,这里的0.0.0.0与前面提到的绑定地址的0.0.0.0有所不同。在绑定地址的上下文中,0.0.0.0意味着服务监听所有可用的网络接口。而在Foreign Address中,它表示接受来自任何地址的连接。
另外,如果你在查看一个已经建立的连接,Foreign Address通常会显示实际的远程客户端IP地址和端口号,而不是0.0.0.0:。这种显示通常只出现在监听状态的套接字上。
State链路状态,共有11种state列共有12中可能的状态,前面11种是按照TCP连接建立的三次握手和TCP连接断开的四次挥手过程来描述的。 PID/Program PID即进程id,Program即使用该socket的应用程序 recv-Q:网络接收队列 表示收到的数据已经在本地接收缓冲,但是还有多少没有被进程取走,recv()如果接收队列Recv-Q一直处于阻塞状态,可能是遭受了拒绝服务 denial-of-service 攻击; send-Q:网路发送队列 本地没有发生的数据,如果发送队列Send-Q不能很快的清零,可能是有应用向外发送数据包过快,或者是对方接收数据包不够快; 这两个值通常应该为0,如果不为0可能是有问题的。packets在两个队列里都不应该有堆积状态。可接受短暂的非0情况。
text
======================== TCP CLIENT ===================================================
[root@localhost ~]# netstat -tnp | more
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:3050 127.0.0.1:32795 ESTABLISHED 3161/fbserver
tcp 0 0 10.228.90.11:22 10.41.166.94:58005 ESTABLISHED 13824/sshd
tcp 0 0 10.228.90.11:49168 10.41.103.97:443 TIME_WAIT -
tcp 0 13032 10.228.90.11:8002 10.228.90.5:11111 ESTABLISHED 6738/./tcp_client
...
======================== TCP SERVER ===================================================
[root@localhost ~]# netstat -anplt
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 89768 0 10.228.90.5:11111 10.228.90.11:8002 ESTABLISHED 29561/./tcp_server
如图上所示,TCP SERVER 没有读取 TCP CLIENT 发来的数据。因为收到的数据Recv-Q一直处于阻塞状态,因此本地服务没有及时读取接收到的数据。
2 :Active UNIX domain sockets
有源Unix域套接口(和网络套接字一样,但是只能用于本机通信,性能可以提高一倍)。查看unix接口命令如下:
shell
[root@untifa_80 test]# netstat -x | more
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ] DGRAM 11885 /var/run/chrony/chronyd.sock
unix 4 [ ] DGRAM 408 /run/systemd/notify
unix 2 [ ] DGRAM 410 /run/systemd/cgroups-agent
unix 5 [ ] DGRAM 425 /run/systemd/journal/socket
unix 23 [ ] DGRAM 427 /dev/log
unix 2 [ ] DGRAM 13228 /run/systemd/shutdownd
unix 3 [ ] STREAM CONNECTED 27339
unix 3 [ ] STREAM CONNECTED 21837 /run/dbus/system_bus_socket
unix 3 [ ] STREAM CONNECTED 36271
unix 3 [ ] STREAM CONNECTED 29681
unix 3 [ ] STREAM CONNECTED 32849 @/tmp/dbus-XgmdN0dfJN
unix 3 [ ] STREAM CONNECTED 34151
unix 3 [ ] STREAM CONNECTED 31180
unix 3 [ ] STREAM CONNECTED 32821 /run/dbus/system_bus_socket
unix 3 [ ] STREAM CONNECTED 27474 /run/systemd/journal/stdout
unix 3 [ ] STREAM CONNECTED 18860 /run/systemd/journal/stdout
unix 3 [ ] STREAM CONNECTED 29890
unix 3 [ ] STREAM CONNECTED 31958 /run/dbus/system_bus_socket
unix 3 [ ] STREAM CONNECTED 30945 /run/systemd/journal/stdout
unix 3 [ ] STREAM CONNECTED 24506
unix 3 [ ] STREAM CONNECTED 12184 /run/dbus/system_bus_socket
unix 2 [ ] DGRAM 22562
unix 3 [ ] STREAM CONNECTED 33851 /run/systemd/journal/stdout
unix 3 [ ] STREAM CONNECTED 33814 /run/systemd/journal/stdout
unix 3 [ ] STREAM CONNECTED 28454 /run/systemd/journal/stdout
unix 3 [ ] STREAM CONNECTED 15069 /run/systemd/journal/stdout
unix 3 [ ] STREAM CONNECTED 31082 @/tmp/.ICE-unix/1684
- Proto 显示连接使用的协议
- RefCnt 表示连接到本套接口上的进程号
- Types 显示套接口的类型
- State 显示套接口当前的状态
- Path 表示连接到套接口的其它进程使用的路径名
常用方法
shell
1 列出所有端口 (包括监听和未监听的)
列出所有端口 netstat -a
列出所有 tcp 端口 netstat -at
列出所有 udp 端口 netstat -au
2 列出所有处于监听状态的 Sockets
只显示监听端口 netstat -l
只列出所有监听 tcp 端口 netstat -lt
只列出所有监听 udp 端口 netstat -lu
只列出所有监听 UNIX 端口 netstat -lx
3 显示每个协议的统计信息
显示所有端口的统计信息 netstat -s
显示 TCP 或 UDP 端口的统计信息 netstat -st 或 -su
4 在 netstat 输出中显示 PID 和进程名称 netstat-p
netstat -p 可以与其它开关一起使用,就可以添加 "PID/进程名称" 到 netstat 输出中, 这样 debugging 的时候可以很方便的发现特定端口运行的程序。
5 在 netstat 输出中不显示主机,端口和用户名 (host, port or user)
当你不想让主机,端口和用户名显示,使用 netstat -n。将会使用数字代替那些名称。
同样可以加速输出,因为不用进行比对查询。
# netstat -an
如果只是不想让这三个名称中的一个被显示,使用以下命令
# netsat -a --numeric-ports
# netsat -a --numeric-hosts
# netsat -a --numeric-users
6 持续输出 netstat 信息
netstat 将每隔一秒输出网络信息。
# netstat -c
7 显示系统不支持的地址族 (Address Families)
netstat --verbose
8 显示核心路由信息 netstat -r
# netstat -r
注意: 使用 netstat -rn 显示数字格式,不查询主机名称。
[root@localhost ~]# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
80.80.80.0 0.0.0.0 255.255.255.0 U 0 0 0 eth8
10.228.90.0 0.0.0.0 255.255.255.0 U 0 0 0 eth9
1.1.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tap0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth8
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth9
10.0.0.0 10.228.90.1 255.0.0.0 UG 0 0 0 eth9
0.0.0.0 1.1.0.3 0.0.0.0 UG 0 0 0 tap0
表头说明:
Destination:目标网络或者主机。
Gateway:网关地址,如果没有设置则为*。
Genmask:目标网络掩码;如果默认路由则用"0.0.0.0"。
Flags标志说明:
U Up表示此路由当前为启动状态
H Host,表示此网关为一主机
G Gateway,表示此网关为一路由器
R Reinstate Route,使用动态路由重新初始化的路由
D Dynamically,此路由是动态性地写入
M Modified,此路由是由路由守护程序或导向器动态修改! 表示此路由当前为关闭状态
Iface:对于这个路由,数据包将要发送到那个接口(网卡)。
3.9 找出程序运行的端口
并不是所有的进程都能找到,没有权限的会不显示,使用 root 权限查看所有的信息。
# netstat -ap | grep ssh
找出运行在指定端口的进程
# netstat -an | grep ':80'
3.10 显示网络接口列表
# netstat -i
显示详细信息,像是ifconfig 使用 netstat-ie
[root@localhost ~]# netstat -i
Kernel Interface table
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth8 1500 0 9150807 0 0 0 128 0 0 0 BMRU
eth9 1500 0 9297220 0 0 0 144187 0 0 0 BMRU
eth12 1500 0 294871 0 0 0 6 0 0 0 BMRU
eth13 1500 0 0 0 0 0 6 0 0 0 BMRU
lo 16436 0 95290843 0 0 0 95290843 0 0 0 LRU
tap0 1500 0 0 0 0 0 48 0 0 0 BRU
tap0:1 1500 0 - no statistics available - BRU
说明:
MTU和Met字段表示的是接口的MTU和度量值值;RX和TX这两列表示的是已经准确无误地收发了多少数据包( RX - OK / TX - OK)、产生了多少错误( RX-ERR/TX-ERR)、丢弃了多少包(RX-DRP/TX-DRP),由于误差而遗失了多少包(RX-OVR/TX-OVR);最后一列展示的是为这个接口设置的标记,在利用ifconfig显示接口配置时,这些标记都采用一个字母。它们的说明如下:
B 已经设置了一个广播地址。
L 该接口是一个回送设备。
M 接收所有数据包(混乱模式)。
N 避免跟踪。
O 在该接口上,禁用A R P。
P 这是一个点到点链接。
R 接口正在运行。
U 接口处于"活动"状态。
1:查看tcp连接
shell
netstat -nlpt
2:查看udp连接
shell
netstat -alupn
3:TCP的11种主要状态:
text
1:LISTEN(监听) : 服务器处于监听状态,等待客户端的连接请求。
2:SYN-SENT(同步已发送) : 客户端已发送一个连接请求(SYN,同步序列编号),正在等待服务器的响应。
3:SYN-RECEIVED(同步已接收) : 服务器已接收到客户端的连接请求,并发送了一个响应(SYN-ACK,同步和确认),正在等待客户端的最终确认。
4:ESTABLISHED(已建立) : 客户端和服务器之间的连接已成功建立,可以开始数据传输。
5:FIN-WAIT-1(终止等待1) : 发送方(客户端或服务器)已发送一个终止连接的请求(FIN,结束),但还在等待对方的确认。
6:FIN-WAIT-2(终止等待2) : 在FIN-WAIT-1之后,发送方收到了对方的确认,但还在等待对方发送的终止连接请求。
7:CLOSE-WAIT(关闭等待) : 接收方(客户端或服务器)已接收到对方的终止连接请求,但还没有发送自己的终止请求。
8:CLOSING(正在关闭) : 双方都已发送了终止连接的请求,但还没有完全关闭连接。
9:LAST-ACK(最后确认) : 发送方在收到对方的终止请求后,已发送了最终的确认,正在等待对方的连接完全关闭。
10:TIME-WAIT(时间等待) : 在发送方发送了最终的确认之后,会进入TIME-WAIT状态,等待一段时间(通常是2个最大段生命周期MSL),以确保对方能够接收到这个确认。
11:CLOSED(已关闭) : 连接已经完全关闭,没有任何数据传输正在进行。
统计tcp各种状态信息
- 找出程序运行的端口
shell
netstat -ap | grep ':80'
- 查看连接某服务端口最多的的IP地址(前20个)
shell
netstat -nat | grep "10.1.62.23:443" |awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -20
- TCP各种状态列表
shell
netstat -nat |awk '{print $6}'
- 统计数量
shell
netstat -nat |awk '{print $6}'|sort|uniq -c
- 排序
shell
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]}'
- 直接统计tcp数量监听的数量
shell
netstat -ant | wc -l
ps
一、命令介绍
ps 命令是 Process Status 的缩写,是一个命令行实用程序,用于显示或查看与Linux系统中运行的进程相关的信息。
命令原理:ps 是通过读取虚拟文件:/proc 拿到进程数据的,不需要给 ps 设置任何的权限就可以运行。
更深层次的后面再分析。
ps可以接受几种不同的选项:
UNIX 选项,带有前导 - 风格的,也叫 Standard-Style (标准风格)。
BSD 选项,不带前导 - 风格的,也叫 BSD-Style 。
GNU long 选项,前面带两个 -,即 --
不同类型的选项可以自由混合,但也会出现冲突,有一些同义的选项,它们功能是相同的,由于许多标准进行了兼容实现。
二、命令选项
参数 | 描述 |
---|---|
a | 选择所有进程(BSD-Style)。 |
-A | 选择所有进程,与 -e 等同(标准格式)。 |
-a | 选择除 session 领导者和没有与终端关联的进程之外的所有进程。 |
c | 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。 |
-d | 选择除了 session leader 的所有进程。 |
--deselect | 选择除满足指定条件之外的所有进程,即反选,与 -N 等同。 |
-e | 选择所有进程,与 -A 等同。 |
e | 列出程序时,显示每个程序所使用的环境变量。 |
-f | 全格式显示 |
f | 用ASCII字符显示树状结构,表达程序间的相互关系。 |
-H | 显示树状结构,表示程序间的相互关系。 |
-l | 长格式显示 |
-N | 显示所有的程序,除了执行ps指令终端机下的程序之外,与 --deselect 等同。 |
s | 采用程序信号的格式显示程序状况。 |
S | 列出程序时,包括已中断的子程序资料。 |
-t <终端机编号> | 指定终端机编号,并列出属于该终端机的程序的状况。 |
T | 选择与该终端关联的所有进程,和不带参数的 t 选项等同。 |
u | 以用户为主的格式来显示程序状况。 |
r | 仅选择运行中的进程。 |
x | 显示所有程序,不以终端机来区分,与 a 一起配合使用。 |
-o | 自定义输出格式,其中 可以是如下的格式选项之一或组合:%cpu、%mem、%tty、%time、%cmd等。例如,ps -o pid,tty,cmd 将只显示进程ID、终端类型和执行的命令行 |
- Process ID (PID),即进程ID这是标识进程的任意数字。每个进程都有一个唯一的ID,但是在进程退出并且父进程检索了退出状态之后,进程ID将被释放,供新进程重用。
- Parent Process ID (PPID),即父进程ID如果父进程在子进程退出之前退出,则子进程的PPID将更改为另一个进程。
- Process Group ID (PGID)这是进程组leader的PID。如果PID == PGID,则此进程是进程组领导。
- Session ID (SID)这是会话领导者的PID。如果PID == SID,则此进程为会话领导进程。会话和进程组只是将一些相关的进程作为一个单元来对待的方法。一个进程组的所有成员总是属于同一个会话,但是一个会话可以有多个进程组。通常,shell将是会话领导者,该shell执行的每个管道将是一个进程组。这是为了在shell退出时很容易杀死它的子进程。
- USER: 进程的拥有者。这通常是运行该进程的用户帐户的名称。
- %CPU: 该进程占用的CPU使用率百分比。
- %MEM: 该进程占用的物理内存使用率百分比。
- VSZ: 虚拟内存大小,单位是KB。这表示进程使用的虚拟内存量。
- RSS: 常驻集大小,单位是KB。这表示进程在物理内存中占用的固定大小。
- TTY: 终端类型。如果进程没有与任何终端关联,则显示为"?"。
- STAT: 进程状态。这描述了进程的当前状态,例如运行中、休眠等。
R:该进程正在运行
S:该进程正在休眠,但可被某些信号(signal)唤醒
D:无法中断的休眠状态(通常为IO进程)
T:该进程已经停止
Z:僵死状态,该进程应该已经终止,但是其父进程却无法正常的终止它,造成zombie(疆尸)程序的状态
W:等待状态,等待内存的分配
<:高优先级的进程
N:低优先级的进程
t:在跟踪期间由调试器停止。
I:闲置的内核线程。
X:已经死亡的进程,正常情况下是看不到的。
L:页面是否被锁定在内存中(用于实时和自定义输入输出)。
s:session领导者
l:表示有多个线程。
+:在前台进程组中。
- START: 进程启动的时间。
- TIME: 该进程实际使用CPU的时间,单位是小时:分钟:秒。
- COMMAND: 启动进程的命令名称或命令行。
- PPID:父进程ID,表示创建该进程的父进程的ID。
- C:CPU使用率,表示该进程占用的CPU百分比。
- STIME:进程启动的时间
- F:代表这个进程的flag,如果是4,则代表使用者为 super user
- S:代表这个进程的状态stat
- PRI:指进程的执行优先级(Priority的简写),其值越小越早被执行
- NI:代表进程的nice值,其表示进程可被执行的优先级的修正数值
- ADDR:代表进程的地址,它指出该进程在内存的哪个部分,如果是个正在运行的程序,一般都是"-"
- SZ:占用的内存大小
- WCHAN:判断当前进程是否正在运行,若为"-",则代表正在运行;若该进程处于休眠状态,该值就是它在内核中的地址
常用的一些命令集合
shell
# 较长、较详细的将属于本次登入用户的进程列出来
ps -l
# 列出当前内存中的所有进程
ps -aux
# 按照cpu占用来排序
ps -aux --sort -pcpu|less -N
# 按照内存占用来排序
ps -aux --sort -pmem|less -N
# ps 命令会显示你系统当前的进程状态,但是这个结果是静态的。如果我们想要使用ps命令来实时查看进程状态,并且通过CPU和内存用量来对结果进行排序,并且希望结果能够每秒刷新1次,我们可以把ps命令和watch命令结合起来使用
watch -n 1 'ps -aux --sort -pcpu,+pmem | head -6'
# 查看指定进程
ps -ef | grep java
#自定义输出格式,只显示进程ID、终端类型和执行的命令行
ps -o pid,tty,cmd
#这条命令提供了关于进程的详细状态信息,包括线程ID、命令名称、本地和远程信号时间、CPU和内存使用情况等
ps -o stat,tid,comm,lwp,pri,ni,stime,etime,cpu,rss,pcpu,pmem,args --sort=-tid --sort=-pcpu
#可以通过组合不同的选项和参数来定制ps命令的输出,以满足特定的需求。 下面的命令将按CPU使用率降序显示进程,并只显示前10个结果。
ps aux --sort=-%cpu | head
# 查看特定用户的进程:如果你想查看特定用户的所有进程,可以使用以下命令: ps -u <用户名> 例如
ps -u root
# 如果你还想查看该用户所运行的所有子进程,可以使用 ps -e -o user,pid,cmd | grep <用户名> 命令。例如,要查找所有以"root"用户运行的进程,你可以输入下面的命令。这将列出所有由root用户启动的进程及其命令行。
ps -e -o user,pid,cmd | grep root
# 查看特定进程:如果你想查看特定进程的详细信息,可以使用 ps -p <pid> 命令,其中 <pid> 是你要查找的进程的ID号。例如,要查找PID为1234的进程,你可以输入如下命令,这会显示出该进程的详细信息,包括它的状态、CPU使用率、内存使用率等。
ps -p 1234
# 查看线程信息:如果你想查看某个进程的线程信息,可以使用 ps -T -p <pid> 命令,其中 <pid> 是你要查找的进程的ID号。例如,要查找PID为1234的进程的所有线程,你可以输入如下命令。这会显示出该进程的所有线程及其相关信息。
ps -T -p 1234
#查看系统负载:如果你想查看系统的负载情况,可以使用 uptime 命令。这将显示出系统已经运行了多长时间、有多少用户在线、以及系统负载的平均值等信息。如果你还想查看更详细的系统负载信息,可以使用 top 或 htop 命令。这些命令可以实时地显示出系统的CPU使用率、内存使用率、运行的进程等信息,并且还可以进行交互操作。
lsof
lsof
(List Open Files)命令在Linux系统中用于查看当前系统上所有打开的文件和与之关联的进程。每个进程在系统中都有文件描述符,用于指向打开的文件,这些文件可以是磁盘文件、网络套接字、管道等。
lsof
命令可以帮助用户了解哪些文件被哪个进程打开,以及这些文件的状态信息。命令可以帮助系统管理员或者开发人员诊断和排查各种与文件访问相关的问
text
语法:
lsof [选项] [文件]
`-a` 或 `--all`:显示所有打开的文件,不仅仅是已经被映射到内存中的文件。
`-c <字符串>` 或 `--command <字符串>`:只显示指定命令的打开文件。
`-d <文件描述符>` 或 `--disk-only`:只显示指定文件描述符的文件。
`-h` 或 `--human-readable`:以易读的格式显示文件大小。
`-i` 或 `--network`:显示网络相关的文件(如套接字)。
`-n` 或 `--numeric`:不解析网络地址,显示数字形式的端口号和进程ID。
`-p <PID>` 或 `--pid <PID>`:只显示指定进程ID的打开文件。
`-u <用户>` 或 `--user <用户>`:只显示指定用户的所有打开文件。
`-v` 或 `--verbose`:详细显示信息,包括进程的环境和文件的状态。
`-t` 或 `--tables`:只更新打开文件的表,而不显示它们。
`-x` 或 `--extend`:显示额外的信息,如文件权限和文件系统类型。
-g:列出指定GID号进程详情;
+d<目录>:列出目录下被打开的文件;
+D<目录>:递归列出目录下被打开的文件;
-n<目录>:列出使用NFS的文件;
-i<条件>:列出符合条件的进程(协议、:端口、 @ip )
-p<进程号>:列出指定进程号所打开的文件;
-u:列出指定UID号或用户名的进程详情;
-h或-?:显示帮助信息;
-v:显示版本信息
-t:只显示进程id
-r<time-interval>:重复执行,直到它接收到来自用户的中断/终止信号
+r<time-interval>:重复模式将在其输出没有打开文件时立即结束
实例:
shell
# 1.列出所有打开的文件:
lsof
#备注: 如果不加任何参数,就会打开所有被打开的文件,建议加上一下参数来具体定位
# 2. 查看谁正在使用某个文件
lsof /filepath/file
# 3.递归查看某个目录的文件信息
lsof +D /filepath/filepath2/
#备注: 使用了+D,对应目录下的所有子目录和文件都会被列出
# 4. 比使用+D选项,遍历查看某个目录的所有文件信息 的方法
lsof | grep '/filepath/filepath2/'
# 5. 列出某个用户打开的文件信息
lsof -u username
#备注: -u 选项,u其实是user的缩写
# 6. 列出某个程序所打开的文件信息
lsof -c mysql
#备注: -c 选项将会列出所有以mysql开头的程序的文件,其实你也可以写成lsof | grep mysql,但是第一种方法明显比第二种方法要少打几个字符了
# 7. 列出多个程序多打开的文件信息
lsof -c mysql -c apache
# 8. 列出某个用户以及某个程序所打开的文件信息
lsof -u test -c mysql
# 9. 列出除了某个用户外的被打开的文件信息
lsof -u ^root
#备注:^这个符号在用户名之前,将会把是root用户打开的进程不让显示
# 10. 通过某个进程号显示该进行打开的文件
lsof -p 1
# 11. 列出多个进程号对应的文件信息
lsof -p 123,456,789
# 12. 列出除了某个进程号,其他进程号所打开的文件信息
lsof -p ^1
# 13 . 列出所有的网络连接
lsof -i
# 14. 列出所有tcp 网络连接信息
lsof -i tcp
# 15. 列出所有udp网络连接信息
lsof -i udp
# 16. 列出谁在使用某个端口
lsof -i :3306
# 17. 列出谁在使用某个特定的udp端口
lsof -i udp:55
#特定的tcp端口
lsof -i tcp:80
# 18. 列出某个用户的所有活跃的网络端口
lsof -a -u test -i
# 19. 列出所有网络文件系统
lsof -N
# 20.域名socket文件
lsof -u
# 21.某个用户组所打开的文件信息
lsof -g 5555
# 22. 根据文件描述列出对应的文件信息
lsof -d description(like 2)
# 23. 根据文件描述范围列出文件信息
lsof -d 2-3
实例参考文档:https://www.cnblogs.com/sparkbj/p/7161669.html
df、显示文件系统磁盘使用情况统计
统计磁盘整体情况,包括磁盘大小,已使用,可用。命令"df"
命令"df -lh"使用这个命令会更清楚磁盘使用情况
命令"df -a"是全部的文件系统的使用情况
命令"df -i"显示inode信息
命令"df -k"已字节数显示区块占用情况
查看当前目录df -h,统计每个目录下磁盘的整体情况
查看指定目录,在命令后直接放目录名,比如查看"usr"目录使用情况:df -h /usr/,统计了指定目录一使用情况,及分配的最大空间
具体查看文件夹的占用情况,查看当前目录每个文件夹的情况,最后一行统计整体占用多少磁盘
计算文件夹大小,为了快算显示,同时也只是想查看目录整体占用大小。可以直接使用du -sh 命令,如果想查看指定目录,直接在命令后根目录即可。
shell
df
shell
df -lh
shell
df -a
shell
df -i
shell
df -k
shell
df -h
shell
df -h /dir/
du、显示目录或文件的大小
shell
du --max-depth=1 -h
shell
du --max-depth=1 -h /dir/
shell
du -sh /dir/
lsblk 【查看磁盘(块设备)使用情况】
shell
lsblk
dstat 监控命令详解
Linux命令之dstat-csdn
Linux命令之dstat-cnblogs
命令格式:
dstat [-afv] [options...] [delay [count]]
delay - 两次输出之间的时间间隔,默认是1s
count - 报告输出的次数,默认是没有限制,一直输出知道ctrl+c
机翻:
参数 | 说明 |
---|---|
-a/--all | 是默认值相当于 -cdngy (default) |
-c/--cpu | 开启cpu统计 |
-d/--disk | 开启disk统计 |
-D | 改选跟具体的设备名(多个用逗号隔开)如:total,hda,hdb表示分别统计total、hda、hdb设备块 |
-f/--full | 相当于 -C, -D, -I, -N and -S |
-g/--page | 开启分页统计 |
-i/--int | 开启中断统计 |
-l/--load | 开启负载统计 |
-m/--mem | 开启内存统计,包括used,buffers,cache,free |
-n/--net | 开启net统计,包括接受和发送 |
-N | 该选项可以跟网络设备名多个用逗号隔开,如eth1,total |
-p/--proc | 开启进程统计,包括runnable, uninterruptible, new |
-r/--io | io开启请求统计,包括read requests, write requests |
-s/--swap | 开启swap统计,包括used, free |
-S | 该选项可以跟具体的交换区,多个用逗号隔开如swap1,total |
-t/--time | 启用时间和日期输出 |
-y/--sys | 开启系统统计,包括中断和上下文切换 |
--fs | 开启文件系统统计,包括 (open files, inodes) |
--ipc | 开启ipc统计,包括 (message queue, semaphores, shared memory) |
--output file | 输出结果到cvs文件中 |
--raw | 启用raw相关的统计数据 |
--socket | 启用socket相关的统计数据 |
--top-cpu | 显示最占用cpu的进程 |
--top-io | 显示最占用io的进程 |
--top-mem | 显示最占用内存的进程 |
--tcp | 启用tcp相关的统计数据 |
--udp | 启用udp相关的统计数据 |
shelldstat -p 1 5
展示当前时刻的进程状态:可运行态(就绪态),无法中断的睡眠态(等待态),新进程,
文档原文为:runnable, uninterruptible, new。
就绪态进程多代表负载较高,配合-l参数确认,比如run为80,即当前有80个进程等待CPU处理,等待态进程多代表当前IO可能有问题,等待态进程是内存中等待非CPU资源的进程,一般是等待IO,可以根据-c的wai列确认, 进一步根据-g的in列确认是否是内存瓶颈后的恢复期,配合-s参数查看换页使用情况,
-d查看当前bio情况,如果-d的bio的read和-g的in差不多,表名当前IO主要是换页到内存加载造成的,即内存不足后的恢复期,
如果-g和-s表名换页未使用,但是-d居高,则说明当前有大量进程等待磁盘IO,
使用--top-bio-adv确定bio最高的进程,
如果-d也不高,但是-n较高,说明进程等待网络IO
使用--top-io-adv确定IO最高的进程。
--proc-count:展示进程数量,侧面反映系统负载
shelldstat -y 1 5
-y, --sys:展示系统中断次数int和上限文切换次数csw,
上下文切换:CPU运行任务1,切换运行就绪态任务2,
任务1可能变成就绪态(CPU时间片耗光),
也可能变成等待态(等待IO等非CPU资源),
CPU的处理时间片较短,中断和上下文切换次数数字会很大,
也能从侧面反映负载,如果中断和上下文切换暴涨,
表明负载过大,或者程序设计不合理,或者kernel级别的BUG。
shelldstat --ipc 1 5
--ipc:展示IPC(进程间通信)状态,
包括msg消息队列 ,sem线程队列,shm共享内存使用
--top-cpu 1 5
展示最耗CPU的进程名和CPU占比
--top-cpu-adv 1 5展示最耗CPU的进程名、PID和CPU占比以及读写信息,
这个读写信息是一个差值,推测是内存的读写。
--top-cputime 1 5展示耗费CPU时间最多的进程名和耗费时间(ms)
--top-latency显示延迟最高的进程名和延迟时间(ms)
--top-bio-adv展示当前最耗block I/O的进程名、PID和读写容量以及CPU占比
即最高磁盘IO的进程。
--top-io展示最耗IO的进程名和IO读写信息,
被统计的IO信息包括blockIO和内存还有网络等全部,
因此如果要判定最耗磁盘读写的进程,应该使用--top-bio,
某一时刻,最耗IO和最耗blockIO的进程不一定是同一个。
--top-mem展示最耗内存的进程名和内存消耗
--top-oom展示最先OOM杀死的进程,OOM是内存回收机制
-m, --mem展示内存状态,包括used, buffers, cache, free
-n, --net展示总体网络收发状态,折算后附带单位友好展示
-N 必须和-n配合使用:dstat -n -N eth0,total当存在多网卡时,可以分别指定展示各个网卡的收发状态
--socket展示套接字状态,包括tot总数量,tcp套接字数量,udp套接字数量,
raw原始套接字数量,frg(ip-fragments IP碎片)套接字数量。
--tcp (listen, established, syn, time_wait, close)展示tcp网络连接状态,lis监听的数量,act(established)活动的确立的数量,
synTCP/IP的握手数量,tim(time_wait)发起关闭后的等待关闭态数量,
clo关闭态数量,即命令netstat -tpln对应记录的搂取合并。
-d, --disk展示磁盘设备读写总计,折算后附带单位友好展示
-D 必须和-d配合使用:dstat -dD sda,sda2,total分别展示设备sda和sda2以及总体的读写状态
--disk-tps展示每个磁盘每秒事物读写数量
lscpu
翻译如下:
lscpu命令从sysfs、/proc/cpuinfo、或者某些适用于特定架构的库中收集数据。命令的输出会以人类易读的方式展示如下信息:cpu、线程、核心、插槽和Non-Uniform MemoryAccess (NUMA)节点的数量,也有cpu共享缓存,cpu的族号,运行模式,处理指令的速度,大小端,步进等信息
在虚拟环境下,系统架构信息展示映射着客户操作系统的设置,这和物理主机是有明显差异的。在架构上支持检索物理拓扑信息,lscpu命令也显示主机系统中的物理插槽数量,芯片,内核数。
Options可以提供一些参数,用这些参数可以自定义命令输出。指定一个列表分隔符,指定一个逗号分隔的列标签列表,以将输出表限制为按指定的顺序排列的指定的列。按指定顺序排列。 有效列标签请参考COLUMNS的列表。列标签不区分大小写。(man的输出中有各种参数太多这里就不放出来了。可以自己去查看)
查看物理CPU的个数
shell
cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l
查看逻辑CPU的个数
shell
cat /proc/cpuinfo |grep "processor"|wc -l
查看CPU是几核
shell
cat /proc/cpuinfo |grep "cores"|uniq
shell
lscpu
Architecture: #架构
CPU(s): #逻辑cpu颗数
Thread(s) per core: #每个核心线程
Core(s) per socket: #每个cpu插槽核数/每颗物理cpu核数
CPU socket(s): #cpu插槽数
Vendor ID: #cpu厂商ID
CPU family: #cpu系列
Model: #型号
Stepping: #步进
CPU MHz: #cpu主频
Virtualization: #cpu支持的虚拟化技术
L1d cache: #一级缓存(google了下,这具体表示表示cpu的L1数据缓存)
L1i cache: #一级缓存(具体为L1指令缓存)
L2 cache: #二级缓存
查看内存信息
shell
cat /proc/meminfo
查看网卡信息
shell
dmesg | grep -i eth