常用linux命令

2021/08/07 880点热度 0人点赞 0条评论

ps 命令用来列出系统中当前运行的那些进程

# 查找对应程序的进程
ps -ef|grep mysql
# 将所有的程序显示出来
ps aux

pstree 命令以树状图显示进程间的关系

# 常用与统计当前系统有多少线程在运行,系统慢,io较高时使用,可以看哪个程序开启的线程多
pstree -p |wc -l
pstree -p  进程号 |wc -l

ulimit 为进程及其子进程的资源使用设置限制

如果log中出现无法创建线程的异常,可以查看下,一般appuser的默认值都不高

# 查看资源限制
sh-4.2$ ulimit
unlimited
sh-4.2$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 31151
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65536 打开文件数
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192 # 当前用户栈最大8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 4096 #当前用户最大进程4096
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

在启动脚本里

#/bin/sh
ulimit -u 128 # 设置最多启动128进程
ulimit -n 256 # 设置文件句柄数不超过256个
start.sh

修改用户的限制

# centos中设置
vim /etc/security/limits.d/*-nproc.conf
appuser    soft    nproc     10240 
appuser    hard    nproc     10240 
appuser    soft    nofile     10240 
appuser    hard    nofile    10240 

#soft 指的是当前系统生效的设置值
#hard 表明系统中所能设定的最大值
# noproc 是代表进程数、nofile 是代表文件打开数
  stack表示堆栈大小,cpu 表示占用的 cpu 时间

top 命令

top - 14:33:59 up 140 days, 17:08,  1 user,  load average: 0.36, 0.14, 0.08
Tasks: 193 total,   1 running, 192 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.7 us,  0.3 sy,  0.0 ni, 99.1 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  8008868 total,   178140 free,  6977448 used,   853280 buff/cache
KiB Swap:  8257532 total,  7999996 free,   257536 used.   517908 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                            
19461 root      20   0 5871784   1.1g   7208 S   1.0 14.1  55:03.21 java                                                                                               
26092 root      20   0 5958732 498696   8656 S   1.0  6.2  67:17.80 java                                                                                               
 7492 gdm       20   0  753896  44568   2848 S   0.7  0.6 844:55.38 gsd-color                                                                                          
26790 appuser   20   0 1344164 222596   8444 S   0.7  2.8  19:43.57 node                                                                                               
    9 root      20   0       0      0      0 S   0.3  0.0  22:03.45 rcu_sched                                                                                          
 8986 root      20   0 5720692 935004   6992 S   0.3 11.7  44:15.39 java                                                                                               
18945 appuser   20   0 6023192   2.4g   8476 S   0.3 31.1  32:35.86 java   
# 综合信息
- 14:33:59  当前时间
up 140 days, 17:08 系统运行了 140天,17小时08分钟
1 user, 当前登录用户数
load average: 0.36, 0.14, 0.08  系统负载
0.36 近1分钟的负载
0.14 近5分钟的负载
0.08 近15分钟的负载

一般能从这个负载看出来系统的情况,逐步上升,说明系统负载高,一般是并发量大或者刚启动项目(没加白名单,或者网不同,导致阻塞,cpu彪高)

# 进程信息
Tasks: 193 total,  193个进程总数
1 running,  正在运行的 运行的越多,cpu利用率越高
192 sleeping, 休眠的 不影响cpu
0 stopped,  停止的
0 zombie 僵尸进程

# cpu信息(可以按核心展示)
%Cpu(s):  
0.7 us, 用户空间占用cpu百分比
0.3 sy,  内核空间占用cpu百分比
0.0 ni, 进程优先级改变占用cpu的百分比
99.1 id, 空闲cpu百分比
0.0 wa,  等待输入输出的cpu占用百分比
0.0 hi,  硬件中断占用cpu百分比
0.0 si,  软件中断占用cpu百分比
0.0 st  虚拟机占用百分比

# 内存信息

KiB Mem : 内存的单位  
8008868 total, 物理总内存   
178140 free,  空闲内存
6977448 used,  使用的物理内存
853280 buff/cache 用于内核缓冲区的内存量

KiB Swap:  
8257532 total, 交换区总量
7999996 free,   空闲的交换区总量
257536 used.  已使用的交互区总量
517908 avail Mem  缓冲区的总量

内存&磁盘使用查看

# 查看内存使用,m表示MB显示(服务器内存报警后查看)
free -m

# 当前目录的大小,并按从大到小排序
du -sh *|sort -rh
B K(1024) M(mb) G(gb) T(tb)
s 算总量
h 表示以1000为基底计算大小
--max-depth=N 计算深度

# 显示磁盘使用情况
df -h

日志检索

  • tail 命令

  • head 命令

  • cat 命令 使用也得注意,最好加|more

  • grep 命令 常和别的命令组合, 正则匹配还是很强大的

  • vim 命令(文件太大,占内容,容易把服务器搞崩,慎用)

# 查看文件末尾最后20行,并实时监听(f循环读取),上线后查看验证
tail -fn 20 5ycode_access.log 
f  循环读取
n  读取多少行

# 查看文件的前10行(有时候查看动是输出了什么,有用)
head -n 10 5ycode_access.log
n 读取多少行
v 显示标题 

# 翻页查看内容
cat 5ycode_access.log |more
按回车一页页的查看

# 从某个文件中搜索关键字,并一页页的显示
grep "article" 5ycode_access.log |more
# 从当前目录中搜索
grep "article" ./* |more

i  忽略大小写
v  取反
n  显示行号
--clolor  匹配的内容高亮显示
-A n after的简写  表示显示匹配到的字符串所在行以及其后n行
-B n before 表示显示匹配到的字符串所在行以及其前n行
-C n context 上下文,表示显示匹配行以及其上下n行

# 从文件的后两万行中检索Exception 并显示对应的后20行(方便检索异常)
tail -fn 20000  error.log |grep 'Exception' -A 20

vim my.ini

vim命令看这张图就行了(忘了从哪找的了)

后端启动 nohup

nohup mqnamesrv 1>/usr/local/rocketMq/logs/out.log 2>/usr/local/rocketMq/logs/error.log &

nohup java -jar  /app/eureka/eureka-server-0.0.1-SNAPSHOT.jar  > /app/eureka/nohup.out 2>&1 &
操作系统中有三个常用的流:
0:标准输入流 stdin
1:标准输出流 stdout
2:标准错误流 stderr
> /app/eureka/nohup.out  实际是  1 >/app/eureka/nohup.out 的简略写法
< nohup.out  ,实际是 0 < nohup.out 

 > /app/eureka/nohup.out 2>&1 &
2>&1是将标准错误流stderr2重定向到标准输出流(&1),标准输出(&1)再被重定向输入到nohup.out 文件中

最后添加的&表示命令结束

awk 拥有自己的语言,允许创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能

# 统计接口出现的次数
awk -F'[ ?]' '{print $7} localhost_access_log.2018-02-12.txt |sort |uniq -c

# 统计链接10.255.200.214:22 的ip前20个
netstat -nat | grep "10.255.200.214:22" |awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -20
- 先以空格分隔取第5个字符串
- 再以: 分隔取第一个字符串
- sort 排序
- uniq -c 去重统计

# 统计3306 端口的TCP状态
netstat -n |grep 3306| awk '/^tcp/ {++y[$NF]} END {for(w in y) print w, y[w]}'
- 先过滤tcp
- 以最后一位构建数组(AWK 中的数组都是关联数组,数字索引也会转变为字符串索引)
- END 最后将数组输出

# 只打印第10行的行号
tail -fn 20 5ycode_access.log | awk '{if (NR==10)   print NR}'

# 同时以" "和: 分隔 输出$4和$5 以" " 拼接
tail -fn 20 5ycode_access.log | awk -F'[ :]+' '{print $4" "$5}'

  • awk 默认是 以 " " 去分隔字符串分隔,然后就是数组的处理$0~$n去取数

  • awk 可以通过 -F 指定分隔方式,可以指定多个

内置函数: awk 正则

rz &sz 文件上传与下载

yum install rz sz

sz file  执行后,会弹出让你保存文件的路径
rz 执行该命令后,在弹出框中选择要上传的文件即可

linux之间文件传输

scp方式需要密码

scp -r 文件 user@ip:目录
scp -r jdk-8u251-linux-x64.tar.gz root@10.255.200.215:/usr/local/java/
输入密码

nc 方式不需要密码

# 接收端先开启命令接收文件
nc -l ip port > 文件名
nc -l 127.0.0.1 9999 > jdk-8u251-linux-x64.tar.gz
# 发送端发送对应的文件
nc ip port < 文件名
nc 127.0.0.1 9999 < jdk-8u251-linux-x64.tar.gz

防火墙操作

查看防火墙状态

firewall-cmd --state

查看域

# 查看active域
firewall-cmd --get-active-zones
# 查看当前域
firewall-cmd --get-default-zone
#查看网卡对应的域
firewall-cmd --get-zone-of-interface=ine0

查看开放端口

# 查询开放了哪些端口
firewall-cmd --zone=public --list-ports
# 查询80端口有无开放
firewall-cmd --query-port=80/tcp

添加开放端口

# 往对应的zone中添加端口
# 8000-9000表示的是一个范围
# tcp  udp
firewall-cmd --zone=public --add-port=8000-9000/tcp --permanent
# RunTime:当前正在生效的。
# Permanent:永久生效的。

# 配置立即生效
firewall-cmd --reload

关闭端口

firewall-cmd --permanent --zone=public --remove-port=8848/tcp

关闭防火墙

systemctl stop firewalld.service
# 禁止开机启动
systemctl disable firewalld.service

在public域中分别查询ssh与http服务是否被允许

firewall-cmd --zone=public --query-service=ssh
firewall-cmd --zone=public --query-service=http

允许https服务流量通过public区域,要求立即生效且永久有效

# 设置当前有效,如果加上--permanent 则永久有效
firewall-cmd --zone=public --add-service=https
# 让立即生效
firewall-cmd --reload
# 不再允许http访问

firewall-cmd --permanent --zone=public --remove-service=http

对指定ip开放服务

firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="172.17.0.1/16" port port="3306" protocol="tcp" accept'

firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.0.4/24" service name="http" accept"'

端口转发

firewall-cmd --permanent --zone=public --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.0.100
netstat命令
#常用参数
-a (all)显示所有选项,默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。
-l 仅列出有在 Listen (监听) 的服务状态

-p 显示建立相关链接的程序名
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计
-c 每隔一个固定时间,执行该netstat命令。

# 查看端口监听
netstat -lnpt
netstat -lnpt |grep 8080

# 查看TCP链接的状态,比如链接数据库,或者服务链接处在状态
netstat -n |grep 3306| awk '/^tcp/ {++y[$NF]} END {for(w in y) print w, y[w]}'
CLOSE_WAIT 348
ESTABLISHED 1240
TIME_WAIT 5621

# 同上
netstat -nat  |grep 22|awk '{print $6}'|sort|uniq -c|sort -nr

# 统计链接服务器22端口按链接数倒序排,取前20个
[root@dev214 bin]# netstat -nat | grep "10.255.200.214:22" |awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -20
      3 10.203.0.57
      2 10.255.255.247

# 统计nginx access中前20个访问     
awk '{print $1}' access.log |sort|uniq -c|sort -nr|head -10

解决大量TIME_WAIT( 操作系统默认 240 秒后,才会关闭处于 time_wait 状态的连接) vim/etc/sysctl.conf
#编辑文件,加入以下内容:
net.ipv4.tcp_syncookies =1#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse =1#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle =1#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭;
net.ipv4.tcp_fin_timeout=30#修改系統默认的 TIMEOUT 时间。

然后执行以下命令让参数生效 /sbin/sysctl -p

sort

-r 降序显示,默认是升序
-u  去除重复行
-n  以数值排序

jstack

# 将java栈信息输出到对应的文件,如果出现的BLOCKED比较多就会有问题,RUNNABLE比较多也有可能是有慢操作。

jstack pid > pid.log

jmap 命令

一般直接jmap,有对应的额示例

yxkong

这个人很懒,什么都没留下