2.Linux命令
0.常用脚步
0.1.linux
清理内存:
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
监控tcp:
1.统计TCP的总数: TCP连接数: netstat -an |grep 'tcp' |wc -l
2.统计不同状态的tcp总数: netstat -an| grep 'tcp' | awk '/^tcp/ {++S[$NF]} END {for ( a in S )print a,S[a]}'
3.监控TCP总数(1秒钟打印一次):for i in {1..1000};do netstat -n|awk '/^tcp/ {++S[$NF]} END {for(a in S) printf "%-15s\t%-5s", a, S[a] ; print "" }' && sleep 1;done
4.监控TCP总数(指定某个端口):for i in {1..1000};do netstat -tn | grep '8001' |awk '/^tcp/ {++S[$NF]} END {for(a in S) printf "%-15s\t%-5s", a, S[a] ; print "" }' && sleep 1;done
分析日志:标准的Linux日志,字段之间使用空格分开,方便用linux命令分析,用其他分隔符的无法使用以下命令
1.访问Nginx的ip的次数: cat access.log | awk '{print $1}' |uniq -c| sort -nr
2.Tomcat接口请求量: awk '{print $7}' /tomcat/logs/access.txt | sort | uniq -c | sort -fr
3.接口平均耗时: cat /tomcat/logs/access.txt | grep '我的URL' | awk '{print $(NF-2)}' | awk '{cost+=$1;pv++;}END {printf("pv=%d totalCost=%s avgCost=%s\n", pv, cost, cost/pv)}'
4.所有请求每分钟数量:awk -F: '{count[$2]++} END {for (hour in count) print hour, count[hour]}' /tomcat/logs/access.txt
查看进程的资源限制(比如max open files):
pid=`ps -ef | grep 'nginx: master' | awk 'NR==1{print $2}'`;cat /proc/${pid}/limits;
后台运行:nohup java -Xms2g -Xmx2g -jar eureka.jar --spring.profiles.active=s1 --server.port=8001 > eureka.log 2>&1 &
java远程监控:-Djava.rmi.server.hostname=192.168.3.51 -Dcom.sun.management.jmxremote.port=9015 -Dcom.sun.management.jmxremote.rmi.port=9015 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
创建一个1G的文件。使用直接io direct,不经过page cache:dd if=/dev/zero of=testfile.txt oflag=direct bs=1M count=1k
记录命令执行的时间:time cat 文件 > /dev/null
日志查询技巧:
1.查询某个时间段: sed -n '/2023-01-13 21:30/,/2023-01-13 21:35/p' server.log | wc -l
2.查询结果带行号,并且结果返回上下文各4行。 cat -n eureka.log | grep 'd.RetryableEurekaHttpClient' -a4
0.2.window
1.查看进程列表: tasklist | findstr nginx
2.查看服务的端口:
netstat -ant | findstr nginx
netstat -aon | findstr "8082"
netstat -a | find /c "TIME_WAIT" # 统计数量
3.结束进程:
按照应用结束: taskkill /f /t /im nginx.exe
按照PID结束: taskkill /F /PID 1234
4.查看当前目录结构: dir
5.清空窗口: cls
6.本机地址: ipconfig
7.ping: ping 192.168.1.10
8.IP追踪: tracert 192.168.1.1
9.清理C盘垃圾文件(非开发电脑)
@echo off
echo 正在清除系统垃圾文件,请稍等......
del /f /s /q %systemdrive%\*.tmp
del /f /s /q %systemdrive%\*._mp
del /f /s /q %systemdrive%\*.log
del /f /s /q %systemdrive%\*.gid
del /f /s /q %systemdrive%\*.chk
del /f /s /q %systemdrive%\*.old
del /f /s /q %systemdrive%\recycled\*.*
del /f /s /q %windir%\*.bak
del /f /s /q %windir%\prefetch\*.*
rd /s /q %windir%\temp & md %windir%\temp
del /f /q %userprofile%\cookies\*.*
del /f /q %userprofile%\recent\*.*
del /f /s /q "%userprofile%\Local Settings\Temporary Internet Files\*.*"
del /f /s /q "%userprofile%\Local Settings\Temp\*.*"
del /f /s /q "%userprofile%\recent\*.*"
echo 一键清理系统垃圾完成!
echo. & pause
10.使用window作为压测服务器容易出现异常:Address already in use: connect
原因是windows端口被耗尽了(默认1024-5000),而且操作系统要 2~4分钟才会重新释放这些端口,所以可以增加windows的可用端口来解决。windows端口最大数为65535
https://www.cnblogs.com/ngd-mzl/p/16409901.html
查看和修改Windows系统的端口范围: https://blog.csdn.net/xiaochenXIHUA/article/details/124803693
1.基本概念
1.3.介绍
用户接口
- GUI接口:图形化任务接口。
- CLI接口: 命令行任务接口。
虚拟终端(terminal)
- GUI: Graphic User Interface
- Windows、X-Window、Gnome、KDE、Xface
- CLI: Command Line Interface
- sh、bash、csh、ksh、zsh、tcsh
1.2.ls命令
ls 命令的参数如下:
-l: 表示长格式
-h:做单位转换
-a: 显示以.开头的隐藏文件
. 表示当前目录
.. 表示父目录
-A
-d: 显示目录自身属性
-i: index node, inode
-r: 逆序显示
-R: 递归(recursive)显示
使用下面的案例分析返回的内容:
输入命令:ls -l
输出:
drwxrwxr-x 9 root root 4096 6月 5 17:19 apache-tomcat-7.0.70
-rw-rw-r-- 1 root root 69 6月 6 09:09 demo.py
(1)第一列数据的首字母是文件类型:
-:普通文件 (f)
d: 目录文件
b: 块设备文件 (block),比如光驱
c: 字符设备文件 (character),比如键盘,显示器
l: 符号链接文件(symbolic link file),比如快捷方式
p: 命令管道文件(pipe)
s: 套接字文件(socket)
(2)第一列数据剩余的9位是文件权限
文件权限:9位,每3位一组,3组权限(U,G,O)每一组:-rwx(没权限,读,写,执行)
第一组:文件的属主用户权限。第二组:文件的属组用户权限,第三组:其他用户权限
(3)第二列数据文件硬链接的次数
(4)第三列数据文件的属主(owner)
(5)第四列数据文件的属组(group)
(6)第五列数据文件大小(size),单位是字节
(7)第六列数据时间戳(timestamp):最近一次被修改的时间
使用命令:stat 文件名
##############################################################
文件:"demo.py"
大小:69 块:8 IO 块:4096 普通文件
设备:801h/2049d Inode:542096 硬链接:1
权限:(0664/-rw-rw-r--) Uid:( 1000/zhangxue) Gid:( 1000/zhangxue)
Access:2017-06-06 09:09:26.995581562 +0800
Modify:2017-06-06 09:09:25.839581519 +0800
Change:2017-06-06 09:09:25.843581519 +0800
Create:-
##############################################################
访问:access
修改:modify,文件内容发生了改变
改变:change,metadata,元数据
2.2.其他命令
1. cd命令: change directory
家目录,主目录, home directory
cd ~USERNAME: 进入指定用户的家目录
cd -: 在当前目录和前一次所在的目录之间来回切换
3. 获得命令的使用帮助:
内部命令:
help COMMAND 比如:help cd
外部命令:
COMMAND --help 比如:date --help
4. 命令手册:man 命令
5. watch+命令 , 重复执行某个命令
watch date 这样 watch 命令会每隔两秒执行一次该该命令,并全屏输出执行结果
watch -n 5 date -n 指定时间间隔为5秒执行一次
watch -d -n 1 date -d是高亮显示两次执行数据重不同的部分
watch -g date -g是当输出的结果发生变化的时候退出循环
watch -e date 默认情况下, watch 并不会关心命令的执行结果是否成功,但你可以让 watch 检测命令的返回值,当命令运行返回非0时发出蜂鸣(-b/–beep)或者直接退出(-e/–errexit)
watch -t date 若你希望 watch 只显示出命令的执行结果,而不要显示第一行的那些信息,那么可以使用 -t 选项关闭title的显示
6.which 在环境变量$PATH设置的目录里查找符合条件的文件路径
-n<文件名长度> 指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名。
-p<文件名长度> 与-n参数相同,但此处的<文件名长度>包括了文件的路径。
-w 指定输出时栏位的宽度。
-V 显示版本信息。
7.whereis
特定目录中查找符合条件的文件
8.文件上传下载
安装: yum install -y lrzsz
rz 上传命令 sz 下载命令
-a 以文本方式传输(ascii)。
-b 以二进制方式传输(binary)。
-e 对控制字符转义(escape),这可以保证文件传输正确。
如果能够确定所传输的文件是文本格式的,使用 sz -a files
如果是二进制文件,使用 sz -be files
2.文件系统
2.1.基本命令
1.创建文件夹:mkdir
-m: 创建文件夹的权限
-p: 如果父目录不存在,则创建父目录。默认是不创建
-v: 打印创建文件夹时的日志信息
例如:
创建一个文件夹:mkdir /usr/local/java
创建锁哥文件夹:mkdir /usr/a/ /usr/b/ /usr/c/
创建锁哥文件夹:mkdir -pv /usr/{a,b,c}
2.删除空文件夹:rmdir
-p: 如果父目录存在,且只有要删除的一个子文件夹,则创删除目录。默认是不删除
-v: 打印创建文件夹时的日志信息
3.创建文本文件:touch 文件名
-a:只更改访问时间
-m:只更改修改时间
-c:不创建任何文件
4.查看文件信息:stat 文件名
5.删除文件:rm
-r:递归删除
-f:删除时不需要确定
-i:删除时需要确定
6.复制:cp 原文件 新文件
-f 强制删除
-r 递归删除
7.移动文件:mv 原文件 新文件
8.查看文件类型:file 文件名
9.日期时间:
date、clock、hwclock、cal ,ntpdate
ntpdate与其他服务器时间同步:ntpdate -u 域名(ntpdate百度查询即可)
10.查看文本:
cat:查看文本
tac:逆向查看文本
more:分屏显示文件(大文件)
less:分屏显示文件(大文件)
head:只查看首行的内容
tail:只查看尾行的内容。
比如:查看日志文件实时变化:tail -f 文件
11.find 查找文件
sudo -u admin find /home/admin /tmp /usr -name \*.log(多个目录去找)
find / -name "*redis*" 文件名中包括关键字
find . -iname \*.txt(大小写都匹配)
find . -type d(当前目录下的所有子目录)
find /usr -type l(当前目录下所有的符号链接)
find /usr -type l -name "z*" -ls(符号链接的详细信息 eg:inode,目录)
find /home/admin -size +250000k(超过250000k的文件,当然+改成-就是小于了)
find /home/admin f -perm 777 -exec ls -l {} \; (按照权限查询文件)
find /home/admin -atime -1 1天内访问过的文件
find /home/admin -ctime -1 1天内状态改变过的文件
find /home/admin -mtime -1 1天内修改过的文件
find /home/admin -amin -1 1分钟内访问过的文件
find /home/admin -cmin -1 1分钟内状态改变过的文件
find /home/admin -mmin -1 1分钟内修改过的文件
2.2.文件处理命令
常用的文本处理:cut、sort、join、sed、awk
1.cut:切割,适用于处理一行数据
-d: 指定字段分隔符,默认是空格
-f: 指定要显示的字段
-f 1,3
-f 1-3
比如:echo '1 2 3 4 5' | cut -d ' ' -f 1-3
返回 1 2 3
2.文本排序:sort
-n:数值排序
-r: 降序
-t: 字段分隔符
-k: 以哪个字段为关键字进行排序
-u: 排序后相同的行只显示一次
-f: 排序时忽略字符大小写
3.文本统计:wc (word count)
-l 显示行数
-w 显示单词统计数量
-c 文本的字节长度
-m 文本的字符长度
-L 最长行的长度
4.sed使用教程:https://www.runoob.com/linux/linux-comm-sed.html
5.awk使用教程:https://www.runoob.com/linux/linux-comm-awk.html
6.grep
grep forest f.txt #文件查找
grep forest f.txt cpf.txt #多文件查找
grep 'log' /home/admin -r -n #目录下查找所有符合关键字的文件
cat f.txt | grep -i shopbase
grep 'shopbase' /home/admin -r -n --include *.{vm,java} #指定文件后缀
grep 'shopbase' /home/admin -r -n --exclude *.{vm,java} #反匹配
seq 10 | grep 5 -A 3 #上匹配
seq 10 | grep 5 -B 3 #下匹配
seq 10 | grep 5 -C 3 #上下匹配,平时用这个就妥了
cat f.txt | grep -c 'SHOPBASE'
例子:前10个有关键词的行: cat a.txt | grep spring | head -n 10
7.分割文本split
可以指定按行数分割和按字节大小分割两种模式。
(1) 按行数分割
$ split -l 300 large_file.txt new_file_prefix
加上-d,使用数字后缀;加上--verbose,显示分割进度:
$ split -l50000 -d large_file.txt part_ --verbose
(2) 按字节大小分割
$ split -b 10m large_file.log new_file_prefix
8.读取配置文件
比如配置文件a.cfg
a.b=123
我们想要读取a.b的值如下
CONF=/urr/a.cfg
case "$OSTYPE" in
*solaris*)
GREP=/usr/xpg4/bin/grep
;;
*)
GREP=grep
;;
esac
VALUE="$($GREP "^[[:space:]]*a.b" "$CONF" | sed -e 's/.*=//')"
^[[:space:]]* 是匹配开头是空格的
正则表达式
^: 表示字符串开始。
[[:space :]] : 表示匹配空格。
*: 表任意字符。
[[:space :]]* : 表示任意个空格。
$: 表示字符串结束。
9.文件操作符
操作符 说明 举例
-b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
-d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
-p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
-r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。
file="/var/www/runoob/test.sh"
if [ -r $file ]
then
echo "文件可读"
else
2.3.解压缩
zip压缩和unzip解压缩命令
1、把/home目录下面的mydata目录压缩为mydata.zip
zip -r mydata.zip mydata #压缩mydata目录
2、把/home目录下面的mydata.zip解压到mydatabak目录里面
unzip mydata.zip -d mydatabak
3、把/home目录下面的abc文件夹和123.txt压缩成为abc123.zip
zip -r abc123.zip abc 123.txt
4、把/home目录下面的wwwroot.zip直接解压到/home目录里面
unzip wwwroot.zip
5、把/home目录下面的abc12.zip、abc23.zip、abc34.zip同时解压到/home目录里面
unzip abc\*.zip
6、查看把/home目录下面的wwwroot.zip里面的内容
unzip -v wwwroot.zip
7、验证/home目录下面的wwwroot.zip是否完整
unzip -t wwwroot.zip
8、把/home目录下面wwwroot.zip里面的所有文件解压到第一级目录
unzip -j wwwroot.zip
主要参数
-c:将解压缩的结果
-l:显示压缩文件内所包含的文件
-p:与-c参数类似,会将解压缩的结果显示到屏幕上,但不会执行任何的转换
-t:检查压缩文件是否正确
-u:与-f参数类似,但是除了更新现有的文件外,也会将压缩文件中的其它文件解压缩到目录中
-v:执行是时显示详细的信息
-z:仅显示压缩文件的备注文字
-a:对文本文件进行必要的字符转换
-b:不要对文本文件进行字符转换
-C:压缩文件中的文件名称区分大小写
-j:不处理压缩文件中原有的目录路径
-L:将压缩文件中的全部文件名改为小写
-M:将输出结果送到more程序处理
-n:解压缩时不要覆盖原有的文件
-o:不必先询问用户,unzip执行后覆盖原有文件
-P:使用zip的密码选项
-q:执行时不显示任何信息
-s:将文件名中的空白字符转换为底线字符
-V:保留VMS的文件版本信息
-X:解压缩时同时回存文件原来的UID/GID
2.4.权限
************权限*****************
r w x
读 写 执行
4 2 1
1.符号模式赋予权限: chmod 谁+权限 文件/文件夹
rwx r-x r-x
属主 属组 其他人
user group other
谁:a 全部用户和组、u 文件所有者、g 文件所有者所在组、o 所有其他用户
权限:rwx等
2.八进制模式赋予权限: chmod 755 文件/文件夹
6 4 7
rw- r-- rwx
linux下,新创建的文件夹的默认权限是755
linux下,新创建的文件的默认权限是644
3.使用ssh免密码登录
1)产生密钥 ssh-keygen -t rsa
三次回车,在/root/.ssh/下产生两个文件
2)创建授权文件
cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
验证:ssh localhost 不需要输入密码
退出:exit命令
2.5.lsof
lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。
查看某个进程打开文件的数量: lsof -p 7463 | wc -l
对于TCP来说,只有 ESTABLISHED 状态的TCP才占用打开文件数量。
3.日常操作
3.1.vi/vim
https://www.runoob.com/linux/linux-vim.html
3.2.软件管理
centos: https://www.runoob.com/linux/linux-yum.html
Ubuntu: https://www.runoob.com/linux/linux-comm-apt.html
3.3.进程
ps -ef 查看全部进程
进程运行时间: ps -p 24525 -o lstart,etime
杀死进程:
kill -9 25412
killall java
pkill java
3.4.内存
- free
使用free命令查看一下当前内存使用情况
free
total used free shared buff/cache available
Mem: 1015948 703676 95228 3292 217044 147408
Swap: 0 0 0
#针对free命令后出现的信息解释
#total:总计物理内存的大小
#used:已使用多大
#free:可用有多少
#Shared:多个进程共享的内存总额
#Buffers/cached:磁盘缓存的大小
- 执行sync同步数据
sync #该命令将未写的系统缓冲区写到磁盘中 #包含已修改的 i-node、已延迟的块 I/O 和读写映射文件。 - 清理cache
echo 3 > /proc/sys/vm/drop_caches
3.5.磁盘
https://www.runoob.com/linux/linux-filesystem.html
$ df -h
/dev/sda14 4.6G 10M 4.4G 1% /tmp
/dev/sda11 454M 366M 61M 86% /boot
/dev/sda15 55G 18G 35G 35% /home
/dev/sda1 256M 31M 226M 12% /boot/efi
tmpfs 786M 64K 786M 1% /run/user/1000
如果你已经知道home目录占用空间较大了,你想知道home目录下各个目录占用情况:
$ du -h --max-depth=1 /home(或者-d 1)
18G /home/hyb
16K /home/lost+found
18G /home/
这里指定了目录深度,否则的话,它会递归统计子目录占用空间大小,可自行尝试。
3.6.网络
3.6.1.ifconfig命令
[root@machine1 /sbin]#ifconfig
eth0 Link encap:Ethernet HWaddr 52:54:AB:DD:6F:61
inet addr:210.34.6.89 Bcast:210.34.6.127 Mask:255.255.255.128
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:46299 errors:0 dropped:0 overruns:0 frame:189
TX packets:3057 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
Interrupt:5 Base address:0xece0
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:3924 Metric:1
RX packets:44 errors:0 dropped:0 overruns:0 frame:0
TX packets:44 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
- HWaddr 是Mac地址
- eth0 是网卡名称
功能说明:显示或设置网络设备
语 法:
ifconfig [网络设备][down up -allmulti -arp -promisc][add<地址>][del<地址>][<硬件地址>]
[media<网络媒介类型>][mem_start<内存地址>][metric<数目>][mtu<字节>][netmask<子网掩码>][tunnel<地址>]
[-broadcast<地址>] [-pointopoint<地址>]
补充说明:
ifconfig可设置网络设备的状态,或是显示目前的设置。
参 数:
[网络设备] 网络设备的名称。
down 关闭指定的网络设备。
up 启动指定的网络设备。
-arp 打开或关闭指定接口上使用的ARP协议。前面加上一个负号用于关闭该选项。
-allmuti 关闭或启动指定接口的无区别模式。前面加上一个负号用于关闭该选项。
-promisc 关闭或启动指定网络设备的promiscuous模式。前面加上一个负号用于关闭该选项。
add<地址> 设置网络设备IPv6的IP地址。
del<地址> 删除网络设备IPv6的IP地址。
media<网络媒介类型> 设置网络设备的媒介类型。
mem_start<内存地址> 设置网络设备在主内存所占用的起始地址。
metric<数目> 指定在计算数据包的转送次数时,所要加上的数目。
mtu<字节> 设置网络设备的MTU。
netmask<子网掩码> 设置网络设备的子网掩码。
tunnel<地址> 建立IPv4与IPv6之间的隧道通信地址。
-broadcast<地址> 将要送往指定地址的数据包当成广播数据包来处理。
-pointopoint<地址> 与指定地址的网络设备建立直接连线,此模式具有保密功能。
3.6.2.ifconfig配置网卡
- 在eth0上配置上192.168.0.1 的IP地址及24位掩码
ifconfig eth0 192.168.0.1 netmask 255.255.255.0 - 若想再在eth0上在配置一个192.168.1.1/24 的IP地址怎么办?
ifconfig eth0:0 192.168.1.1 netmask 255.255.255.0
这时再用ifconifg命令查看,就可以看到两个网卡的信息了,分别为:eth0和eth0:0
若还想再增加IP,那网卡的命名就接着是:eth0:1、eth0:2……想要几个就填几个。ok!
- 配置网卡的硬件地址
# 网卡的硬件地址更改后,此时你就可以骗过局域网内的IP地址邦定了。 ifconfig eth0 hw ether xx:xx:xx:xx:xx:xx
- eth0、eth1、eth2,代表网卡一,网卡二,网卡三
- hw 代表hardware 硬件意思
- ether 代表ethernet 以太网的意思
-
将网卡禁用 ifconfig eth0 down
-
将网卡启用 ifconfig eth0 up
3.6.3.网卡
上面提到的 eth0 为首的部分是本机的以太网卡配置参数,显示了网卡的设备名/dev/eth0 和硬件的MAC 地址52:54:AB:DD:6F:61
MAC 地址是生产厂家定的,每个网卡拥有的唯一地址。不过这个值是可以自己修改的。
常见的网卡: https://blog.csdn.net/pzqingchong/article/details/75675618
- eth0、eth1、eth2,代表网卡一、网卡二、网卡三。一般指的是物理网卡
- lo代表127.0.0.1,即localhost
- enp3s0,多出现在虚拟机中的以太网卡
- wlp2s0,多出现在虚拟机中的无线网卡
- eth0:1、eth0:2,表示一个网卡绑定了多个ip。说明必然存在一个eth0物理网卡,eth0:1指的就是子网卡
- eth0.1,VLAN的网卡,用于表示网卡绑定了不同VLAN的ip
网卡ifcfg-eth0配置详解: https://blog.51cto.com/xtbao/1671739
配置虚拟IP实例: https://www.cnblogs.com/JohnABC/p/5951347.html
3.6.4.常用命令
1.端口是否被使用: netstat -tulpn | grep 8080
以Nginx为例子:netstat -atnx | grep '8001'
左边客户端ip, 右边服务端ip
接口被访问后,一方面 nginx需要和调用方建立tcp,另一方面,nginx需要和后端服务建立tcp,所有就是双倍
tcp 0 0 0.0.0.0:8001 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:8001 127.0.0.1:59824 ESTABLISHED
tcp 0 0 127.0.0.1:59824 127.0.0.1:8001 ESTABLISHED
2.ARP命令常见用法
可以用来查看是否IP冲突
1、arp -s Ip 物理地址
可以向ARp高速缓存中人工输入一个静态项目。该项目在计算机引导过程中将保持有效状态,或者在出现错误时,
人工配置的物理地址将自动更新该项目。
2、arp -a或arp –g
用于查看高速缓存中的所有项目。-a和-g参数的结果是一样的,多年来-g一直是UNIX平台上用来显示ARp高速缓存中所有项目的选项,
而Windows用的是arp -a(-a可被视为all,即全部的意思),但它也可以接受比较传统的-g选项。
3、arp -d Ip
使用该命令能够人工删除一个静态项目
3.网络:
tcpdump抓包:
tcpdump 默认开启
https://www.cnblogs.com/Jtianlin/p/4330723.html
3.6.5.telnet
1. telnet
telnet 63.172.25.18 6463 回车
Trying 63.172.25.18...
Connected to 63.172.25.18 (63.172.25.18).
Escape character is '^]'.
2、ctrl + ] 回车 进入命令模式
telnet>
3、? 回车
close close current connection
logout forcibly logout remote user and close the connection
display display operating parameters
mode try to enter line or character mode ('mode ?' for more)
open connect to a site
quit exit telnet
send transmit special characters ('send ?' for more)
set set operating parameters ('set ?' for more)
unset unset operating parameters ('unset ?' for more)
status print status information
toggle toggle operating parameters ('toggle ?' for more)
slc change state of special charaters ('slc ?' for more)
auth turn on (off) authentication ('auth ?' for more)
encrypt turn on (off) encryption ('encrypt ?' for more)
forward turn on (off) credential forwarding ('forward ?' for more)
z suspend telnet
! invoke a subshell
environ change environment variables ('environ ?' for more)
? print help information
4、quit 回车(在进入命令模式之后退出telent)
3.7.服务器信息
# 总核数 = 物理CPU个数 X 每颗物理CPU的核数
# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数
1.查看物理CPU个数(是CPU枚数)
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
或者
grep 'physical id' /proc/cpuinfo | sort -u | wc -l
2.查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq
或者
grep 'core id' /proc/cpuinfo | sort -u | wc -l
3.查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l
或者
grep 'processor' /proc/cpuinfo | sort -u | wc -l
4.查看CPU信息(型号)
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
或者
dmidecode -s processor-version
5.内存硬件信息: dmidecode -t memory
6.查看内存信息: cat /proc/meminfo
7.查看内核版本信息: uname -a
8.查看系统已经加载的模块: lsmod
9.查看服务器CPU统计信息: lscpu 或者 cat /proc/cpuinfo
10.查看硬盘和分区分布: lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 931.5G 0 disk
└─sda1 8:1 0 931.5G 0 part /
sdb 8:16 0 2.2T 0 disk /data
11.查看硬盘和分区的详细信息: fdisk -l
12.查看物理网卡的信息: lspci | grep -i 'eth'
13.查看是否是SSD硬盘
# cat /sys/block/sda/queue/rotational
1
因为SSD是非转动盘,如果返回结果为0说明是SSD硬盘,如果返回结果为1,说明是转动盘HDD类的硬盘。
# lsblk -d -o name,rota
NAME ROTA
fd0 1
sda 1
sr0 1
14.查看Linux内核版本命令(两种方法):
1、cat /proc/version
2、uname -a
15.查看Linux系统版本的命令(3种方法):
1、即可列出所有版本信息: lsb_release -a
2、这种方法只适合Redhat系的Linux:cat /etc/redhat-release
3、此命令也适用于所有的Linux发行版。cat /etc/issue
3.8.Top命令
top命令经常用来监控linux的系统状况,是常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。
top的使用方式 top [-d number] | top [-bnp]
-d:number代表秒数,表示top命令显示的页面更新一次的间隔。默认是5秒。
-b:以批次的方式执行top。
-n:与-b配合使用,表示需要进行几次top命令的输出结果。
-p:指定特定的pid进程号进行观察。
显示内容如下:
top - 17:29:09 up 53days, 1 users, load average: 0.00, 0.01, 0.05
Tasks: 69 total, 2 running, 67 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni, 100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 1016168 total, 68820used, 567720 free, 379628 buffers
KiB Swap: 0 total, 0 free ,0 used,.293196 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ CMMOND
2120 kgregory 20 0 4373m 15m 7152 S 0 0.2 0:00.10 Java
第一行,分别是当前时间,系统运行时间当前登录用户数,分别为 1分钟、5分钟、15分钟前的系统负载
第2、3行为进程和CPU的信息,当有多个CPU时,这些内容可能会超过两行
69 total 进程总数
2 running 正在运行的进程数
158 sleeping 睡眠的进程数
0 stopped 停止的进程数
0 zombie 僵尸进程数
0.0 us 用户空间占用CPU百分比
0.0 sy 内核空间占用CPU百分比
0.0 ni 用户进程空间内改变过优先级的进程占用CPU百分比
100.0 id 空闲CPU百分比
0.0 wa iowait,CPU 在等待磁盘 I/O 请求完成时,处于空闲状态的时间百分比
0.0 hi 硬中断(Hardware IRQ)占用CPU的百分比
0.0 si 软中断(Software Interrupts)占用CPU的百分比
0.0 st 用于有虚拟cpu的情况,用来指示被虚拟机偷掉的cpu时间。
第4、5行为内存信息:
KiB Mem: 1016168 total 物理内存总量
567720 used 使用的物理内存总量
68820 free 空闲内存总量
379628 buffers(buff/cache)用作内核缓存的内存量
KiB Swap: 0 total 交换区总量
0 used 使用的交换区总量
0 free 空闲交换区总量
0 cached Mem 缓冲的交换区总量。
293196 avail Mem 代表可用于进程下一次分配的物理内存数量
空行下面的是各进程的资源指标:
VIRT 是虚拟内存空间:虚拟内存映射中所有内存的总和。它在很大程度上是没有意义的。
RES 是驻留集大小:当前驻留在 RAM 中的页数。但这仍然不是一个很好的数字,尤其是在谈到 Java 时。
SHR 是与其他进程共享的常驻内存量。对于 Java 进程,这通常仅限于共享库和内存映射 JAR 文件。
SWAP 默认情况下未打开,因此此处未显示。它指示当前驻留在磁盘上的虚拟内存量, 无论它实际上是否在交换空间 中。
操作系统非常擅长将活动页面保留在 RAM 中,交换的唯一方法是购买更多内存,或减少进程数量,因此最好忽略这个数字。
top在命令显示过程中也可以输入命令,操作显示的内容:
P:以CPU的使用资源排序显示
M:以内存的使用资源排序显示
N:以pid排序显示
T:由进程使用的时间累计排序显示
k:给某一个pid一个信号。可以用来杀死进程
r:给某个pid重新定制一个nice值(即优先级)
q:退出top(用ctrl+c也可以退出top)。
1:可以监控每个逻辑CPU的状况
b或者y:打开关闭加亮效果,显示运行态视图
x:打开/关闭排序列的加亮效果,shift+>或者shift+<左右改变排序序列
f:编辑基本视图中的显示字段
优化点:
- 因为CPU和内存的处理速度远大于磁盘,所以当 CPU 处于 iowait 状态时,说明 CPU 处于空闲状态,并且系统中有进程因为等待 I/O 请求而阻塞, 也说明了 CPU 的利用率不够充分。 这时可以使用异步 I/O(如 iouring)来优化程序,使得进程不会被 I/O 请求阻塞。
3.9.cron定时任务
linux内置的cron进程实现定时任务。使用案例
相关目录:
/var/spool/cron/ 目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名
/etc/crontab 这个文件负责调度各种管理和维护任务。
/etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本。
/var/log/cron 日志
我们还可以把脚本放在/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly目录中,让它每小时/天/星期、月执行一次。
常用命令
crontab [-u username] //省略用户表表示操作当前用户的crontab
-e (编辑工作表)
-l (列出工作表里的命令)
-r (删除工作表)
cron表达式,分、时、日、月、周
* 取值范围内的所有数字
/ 每过多少个数字
- 从X到Z
,散列数字
3.10.curl
查看一个请求整理的响应组成 curl的常用参数
# vim curl-format.txt
time_namelookup: %{time_namelookup}\n
time_connect: %{time_connect}\n
time_appconnect: %{time_appconnect}\n SSL/SSH
time_redirect: %{time_redirect}\n
time_pretransfer: %{time_pretransfer}\n
time_starttransfer: %{time_starttransfer}\n
----------\n
time_total: %{time_total}\n
time_namelookup: %{time_namelookup}\n DNS 域名解析的时候,就是把 https://zhihu.com 转换成 ip 地址的过程
time_connect: %{time_connect}\n TCP 连接建立的时间,就是三次握手的时间
time_appconnect: %{time_appconnect}\n SSL/SSH 等上层协议建立连接的时间,比如 connect/handshake 的时间
time_redirect: %{time_redirect}\n 从开始到最后一个请求事务的时间
time_pretransfer: %{time_pretransfer}\n 从请求开始到响应开始传输的时间
time_starttransfer: %{time_starttransfer}\n 从请求开始到第一个字节将要传输的时间
----------\n
time_total: %{time_total}\n 这次请求花费的全部时间
curl -w "@curl-format.txt" -o /dev/null -s -L "http://127.0.0.1:8090/index"
4.shell编程
4.1.语法
https://www.runoob.com/linux/linux-shell.html
4.2.自定义函数
Shell函数类似于Shell脚本,里面存放了一系列的指令,不过Shell的函数存在于内存,而不是硬盘文件,所以速度很快,
另外,Shell还能对函数进行预处理,所以函数的启动比脚本更快
1.定义函数
function 函数名() {
语句
[return]
}
如果在函数中使用exit命令,可以退出整个脚本,通常情况,函数结束之后会返回调用函数的部分继续执行。
可以使用break语句来中断函数的执行。
declare –f 可以显示定义的函数清单
declare –F 可以只显示定义的函数名
unset –f 可以从Shell内存中删除函数
export –f 将函数输出给Shell
另外,函数的定义可以放到 .bash_profile 文件中,也可以放到使用函数的脚本中,还可以直接放到命令行中,
还可以使用内部的unset命令删除函数。一旦用户注销,Shell将不再保持这些函数。
2、函数的调用
#!/bin/bash
function show() {
echo "hello , you are calling the function"
}
echo "first time call the function"
show
echo "second time call the function"
show
3、函数参数的传递
函数可以通过位置变量传递参数。例如:函数名 参数1 参数2 参数3 参数4
当函数执行时,$1 对应 参数1,其他依次类推。
4、函数的返回值
函数中的关键字"return"可以放到函数体的任意位置,通常用于返回某些值,Shell在执行到return之后,就停止往下执行,
返回到主程序的调用行,return的返回值只能是0~256之间的一个整数,返回值将保存到变量"$?"中
#!/bin/bash
function abc() {
RESULT=`expr $1 \% 2` #表示取余数
if [ $RESULT –ne 0 ] ; then
return 0
else
return 1
fi
}
echo "Please enter a number who can devide by 2"
read N
abc $N
case $? in
0)
echo "yes ,it is"
;;
1)
echo "no ,it isn't"
;;
esac
在这里要注意参数传递了,上面read进来的数字,必须加上$符号才能传递给函数,我刚开始不知道是哪里错了,找了半天才知道是这里出错了
5、函数的载入
如果函数在另外一个文件中,我们该怎么调用它呢?
这里就有一个方法。比如 show 函数写在了function.sh里面了,我们就可以用 source 命令
# 引入shell文件
source function.sh
# 调用函数
show
6.函数的删除
用法:unset –f 函数名
7、函数的变量作用域
默认情况下,变量具有全局作用域,如果想把它设置为局部作用域,可以在其前加入local
local a="hello"
使用局部变量,使得函数在执行完毕后,自动释放变量所占用的内存空间,从而减少系统资源的消耗,
在运行大型的程序时,定义和使用局部变量尤为重要。
8.函数的嵌套
#!/bin/bash
function first() {
function second() {
function third() {
echo "------this is third"
}
echo "this is the second"
third
}
echo "this is the first"
second
}
echo "start..."
first
4.3.echo显示内容带颜色
shell脚本中echo显示内容带颜色显示,echo显示带颜色,需要使用参数-e
格式如下:
echo -e "\033[字背景颜色;文字颜色m字符串\033[0m"
例如:
echo -e "\033[41;36m something here \033[0m"
其中41的位置代表底色, 36的位置是代表字的颜色
注:
1、字背景颜色和文字颜色之间是英文的""
2、文字颜色后面有个m
3、字符串前后可以没有空格,如果有的话,输出也是同样有空格
下面是相应的字和背景颜色,可以自己来尝试找出不同颜色搭配
例
echo -e "\033[31m 红色字 \033[0m"
echo -e "\033[34m 黄色字 \033[0m"
echo -e "\033[41;33m 红底黄字 \033[0m"
echo -e "\033[41;37m 红底白字 \033[0m"
字颜色:30—–37
echo -e "\033[30m 黑色字 \033[0m"
echo -e "\033[31m 红色字 \033[0m"
echo -e "\033[32m 绿色字 \033[0m"
echo -e "\033[33m 黄色字 \033[0m"
echo -e "\033[34m 蓝色字 \033[0m"
echo -e "\033[35m 紫色字 \033[0m"
echo -e "\033[36m 天蓝字 \033[0m"
echo -e "\033[37m 白色字 \033[0m"
字背景颜色范围:40—–47
echo -e "\033[40;37m 黑底白字 \033[0m"
echo -e "\033[41;37m 红底白字 \033[0m"
echo -e "\033[42;37m 绿底白字 \033[0m"
echo -e "\033[43;37m 黄底白字 \033[0m"
echo -e "\033[44;37m 蓝底白字 \033[0m"
echo -e "\033[45;37m 紫底白字 \033[0m"
echo -e "\033[46;37m 天蓝底白字 \033[0m"
echo -e "\033[47;30m 白底黑字 \033[0m"
最后面控制选项说明
\33[0m 关闭所有属性
\33[1m 设置高亮度
\33[4m 下划线
\33[5m 闪烁
\33[7m 反显
\33[8m 消隐
\33[30m — \33[37m 设置前景色
\33[40m — \33[47m 设置背景色
\33[nA 光标上移n行
\33[nB 光标下移n行
\33[nC 光标右移n行
\33[nD 光标左移n行
\33[y;xH设置光标位置
\33[2J 清屏
\33[K 清除从光标到行尾的内容
\33[s 保存光标位置
\33[u 恢复光标位置
\33[?25l 隐藏光标
\33[?25h 显示光标
4.4.操作数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
使用@ 或 * 可以获取数组中的所有元素
#!/bin/bash
array=(1 2 3 4 5);
# 获取数组长度
length=${#array[@]}
# 或者length2=${#array[*]}
#输出数组长度
echo $length
#输出:5
echo $length2
#输出:5
# 输出数组第三个元素
echo ${array[2]}
#输出:3
# 删除下表为1的元素也就是删除第二个元素
unset array[1]
# 遍历数组,输出: 1 3 4 5
for i in ${array[@]};
do
echo $i
;
done
# 删除数组中的所有元素
unset arr_number;
# 遍历数组,数组元素为空,没有任何输出内容
for i in ${array[@]};
do
echo $i
;
done
# 获得0到9的正整数
for i in {0..9};
do
echo $i; # 输出0 ~ 9
done
# 获得随机数
for i in {0..9};
do
echo $RANDOM;
done
#通常情况下 shell 变量调用需要加 $,但是 for 的 (()) 中不需要,下面来看一个例子:
for ((i=1;i<5;i++)); do
echo $i;
done
4.5.函数调用约束
无论前一行的命令成功或失败,都不影响下一行命令的执行
echo 1; echoo 2; echo 3; echo 4
只有前边的命令执行成功了再会继续执行后边的命令
echo 1 && echoo 2 && echo 3 && echo 4
只有前边的命令执行失败了才会继续执行后边的命令,直到有一个执行成功
echo 1 || echo 2 || echo 3 || echo 4
5.开发环境
1.安装jdk
1)增加执行权限 chmod 777 jdk******
2)解压缩 ./jdk*******
3)重命名 mv jdk***** jdk
4)设置环境变量,执行vi /etc/profile
关于文本编辑软件:
字符界面下使用vi或vim进行编辑,命令形式:vi /etc/profile
图形界面下可用gedit进行编辑,命令形式:gedit /etc/profile
增加下面记录
export JAVA_HOME=/usr/local/java/jdk1.8
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
保存退出
5)立即生效 source /etc/profile
验证成功:执行java -version
2.虚拟机
1. VMware Workstation Pro
支持window和Linux,是目前市面上最好的虚拟机。收费,需要破解
https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html
2. Oracle VirtualBox
Oracle出的跨平台的虚拟机。
https://www.virtualbox.org/wiki/Downloads
3.Virtual PC
微软的虚拟机,支持window和Mac
- 本文作者:zhangxue
- 本文链接:https://lucksnow1989.github.io/article/16.Linux/2.Linux命令.html
- 版权声明:本文为本人原创文章,遵循 CC 4.0 BY-NC-SA版权协议,转载请附上原文出处链接和本声明。