基础命令
查看文件
cat 命令
作用:输出整个文件的内容,不论大小。
使用场景:适用于查看小文件,比如 50 行以内,如果文件过大,全部输出不利于查看。
实例:
cat 文件名 #查看文件内容
more 命令
作用:以分页的方式来显示内容,左下角显示百分比,通过空格或回车向下浏览,显示到文件结尾命令则退出
使用场景:顺序浏览较大文件。
实例:
more 文件名 #分页查看文件内容 ls -alh /bin | more #通过管道 分屏显示 bin 目录下内容
使用场景:随意查看文件,并有搜索需求时。
实例:
less 文件名 #随意浏览文件
less 命令
作用:随意浏览文件,通过光标上下键查看所需内容,命令不会退出。在查看过程中,可以通过/ +关键字搜索内容。q退出。
head 命令
作用:显示文件开头某个数量的内容,默认前 10 行。
使用场景:需要显示文件的前几行时,比如一个文件介绍信息一般都在前几行。
实例:
ps -ef | head #显示前 10 条进程 head 文件名 #默认前 10 行 head -n 文件名 #显示文件前 n 行
tail 命令
作用:显示文件末尾某个数量的内容,默认后 10 行。
使用场景:查看文件末尾内容时,比如最新的日志。
实例:
tail 文件名 #默认显示文件后 10 行 tail -100 文件名 #显示后 100 行 tail -f 100 文件名 #循环读取新内容
文件处理
Vim
文本编辑器, Vim 是 Vi 的改进版本,功能强大,自动补全,高亮等等功能。
编辑器各个模式:
- 命令模式:vim 文件名进入命令模式
- 插入模式:按i进入插入模式,编辑内容,esc 退出
- ex 模式:按:进入 ex 模式,进行文件的保存和退出,esc 退出。w:保存文件q:退出程序
- 可视模式:按v进入可视模式,该模式下可以快速移动、选中内容等操作,esc 退出
grep
文本过滤,用于查找文件里符合条件的字符串。
用法:
grep 关键字 文件名 #搜索文件里关键字 grep -v 关键字 文件名 #排除关键字内容显示
实例:
grep insert log.file #查找 log.file 文件中的 insert 关键字内容
wc
文本统计,用于计算字数。
用法:
wc 文件名 #统计文件字节数、字数、行数 wc -l 文件名 #只统计文件行数
实例:
wc mylog.file
sed
利用 script 处理文本内容,可以对文件内容进行替换、删除空白行等正则功能。该功能非常强大,我们只写一两种常用用法。
实例:
sed 's/This/That' test.txt #替换文件中 This 为 That sed 2g test.txt #删除文件第二行 sed '/^$/d' test.txt #删除空白行
uniq
删除文本重复行,用于检测和删除文本文件中重复出现的行列。
实例:
uniq test.txt #删除重复的行 uniq -c test.txt #统计重复的行 uniq -d test.txt #只显示重复的行
AWK
是一种处理文本文件语音强大的分析工具,AWK 提供了极其强大的功能:可以进行正则表达式的匹配,样式装入、流控制、数***算符、进程控制语句甚至于内置的变量和函数。
用法:
awk '{[pattern] action}' {filenames} #行匹配语句 awk '' 只能用单引号 awk -F #-F 相当于内置变量 FS,指定分割字符 awk -f {awk 脚本} {文件名}
实例:
awk '{print $1,$4}' log.txt #每行按空格或 TAB 分割,输出文本中的 1、4 项 awk -F, '{print $1,$2}' log.txt #使用","分割 awk 'length > 80' log.txt #查看长度大于 80 字节的日志信息
文件的传输与查找
Linux 与 Windows、Mac 传输文件
rz、sz 命令是 Linux 与 Windows、Mac 传输文件的命令行工具。
安装:需要安装 lszrz 包。
yum -y install lszrz
使用方法(前提:SSH 工具支持 ZModem)
上传:
rz -e #会弹出文件选择对话框,选择文件,确定后就会上传
下载:
sz 文件名 #发送文件到 Windows、Mac 上
Linux 间传输文件
scp 命令是 Linux 系统下基于 SSH 登录进行安全的远程文件拷贝命令。
用法:
scp [可选参数] file_source file_target scp local_file remote_username@remote_ip:remote_folder #从本地复制到远程 scp local_file remote_username@remote_ip:remote_file #从本地复制到远程 scp -P 4588 remote@www.runoob.com:/usr/local/sin.sh /home/administrator #
文件查找
find 命令用来在指定目录下查找文件。
用法:
find . -name "*.c" #将目前目录及其子目录下所有延伸档名是 c 的文件列出来 find . -type f #将目前目录其其下子目录中所有一般文件列出 find . -ctime -20 #将目前目录及其子目录下所有最近 20 天内更新过的文件列出
查看当前目录
pwd 命令用于显示工作目录。
用法:
pwd #查看当前所在目录 pwdx 进程号 #查看进程执行路径
进程管理
ps 命令
用于显示当前进程的状态。
实例:
ps -ef | grep http #查看 http 进程状态 ps -ef|grep java #查看 java 进程状态 ps -A #列出所有的进程 ps -u root #显示指定用户信息 ps xH #查看所有存在的线程
top 命令
用于实时显示进程的状态,CPU 使用率、内存使用率、load average。
实例:
top #显示 cpu 使用率、内存使用率、load average 和 各个进程状态
ps 命令
用于显示当前进程的状态。
实例:
ps -ef | grep http #查看 http 进程状态 ps -ef|grep java #查看 java 进程状态 ps -A #列出所有的进程 ps -u root #显示指定用户信息 ps xH #查看所有存在的线程
top 命令
用于实时显示进程的状态,CPU 使用率、内存使用率、load average。
实例:
top #显示 cpu 使用率、内存使用率、load average 和 各个进程状态
kill 命令
发送指定信号到进程,用于删除执行中的程序或工作。
实例:
kill 进程号 #杀死进程 kill -HUP 进程号 #发送 SIGHUP 信号,动态更新服务配置 kill -9 进程号 #彻底杀死进程
nohup 命令
不挂断的运行命令。
用法:
nohup ./start.sh &
nohup ./start.sh > start.log &
实例:后台运行 jar 包命令
nohup java -jar my-iot-1.0-SNAPSHOT.jar > mylog.file 2>&1 &
lsof 命令
用户查看进程打开的文件、打开文件的进程、进程打开的端口。
知识背景:在 Linux 环境下,任何事物都以文件的形式存在。
安装:
yum install lsof
实例
查看端口打开的进程信息:
lsof -i:端口号 比如:lsof -i:8080
开启文件的进程:
lsof 文件名
列出进程号所打开的文件:
lsof -p 进程号
系统信息查看
hostname 命令
设置主机名,系统并不会永久保存新的主机名,永久修改需要修改配置文件。
实例:
hostname #查询本机的主机名 hostname 主机名 #设置新的主机名
uptime 命令
该命令能够打印出系统总共运行了多长时间和系统平均负载。
实例:输入命令 uptime,输出入下图。
iostat 命令
用于输出 CPU 和磁盘 IO 的相关信息。
实例
查看所有磁盘 IO,输入命令:
iostat
查看 sda 硬盘,每次隔 2 秒,查看 5 次,命令:
iostat sda 2 5
du、df 命令
查看磁盘容量。
两者命令区别:
- du 查看目录大小
- df 磁盘使用情况
查看磁盘容量的使用情况,直接输入 df。
df -h #同 df,但会格式化文件大小的单位
网络相关
ifconfig 命令
用于显示或设置网络设备。
- 查看活动网卡命令:ifconfig
- 查看指定网卡 eht0 命令:ifconfig eth0
- 查看所有网卡命令:ifconfig -a
netstat 命令
用于显示网络状态。
实例
查看路由表命令:
netstat -rn
显示协议统计信息和当前 TCP/IP 网络连接命令:
netstat -n
查看某端口命令:
netstat -antulp | grep :80
查看所有监听端口命令:
netstat -antulp | grep LISTEN
ss 命令
可以用来获取 socket 统计信息,它可以显示和 netstat 类似的内容。
相比 netstat 优点:快!利用到了 TCP 协议栈中 tcp_diag,当 socket 连接数据非常大时,用 netstat 就是浪费生命。
实例:
显示 tcp 连接信息命令:
ss -t -a
显示 Sockets 摘要命令:
ss -s
列出所有打开的网络连接端口命令:
ss -l
查看进程使用的 socket 命令:
ss -pl
找出打开套接字/端口应用程序命令:
ss -lp | grep 3306
DNS 相关命令
DNS 查询
dig 命令
dig www.baidu.com #基本用法 dig -x 240.23.12.44 #查看反向解析 dig trace baidu.com #从根服务器开始解析一个域名的解析情况
nslookup 命令
nslookup baidu.com #直接查询 nslookup 240.12.12.44 #反向查询
DNS 问题排查:
- 用户侧不能访问,运维侧可以访问,一般是用户 DNS 设置问题
- 用户侧和运维侧同时不能访问,检查 DNS 服务器是否能 ping 通、查看 DNS 服务器的 53 端口是否可用
日志查看
常用日志文件目录:
- 系统启动后的信息和错误日志:/var/log/message
- 与安全相关的日志:/var/log/secure
- 与定时任务相关的日志:/var/log/corn
- 守护进程启动和停止相关的日志消息:/var/log/boot.log
- 该日志文件永久记录每个用户登录,注销,系统的启动与停机的事件:/var/log/wtmp
CPU 飙高和频繁 GC 用什么命令怎么查
首先导致 CPU 飙升的原因有哪些?
- 代码可能存在死循环
- 频繁的 GC
- 多线程频繁上下文切换或过多的可运行状态线程
然后通过 top -Hp 进程号 查看进程的线程情况:
top -Hp 16783
如果是 Java 进程导致,找到线程号,通过 jstack pid |grep tid(线程号得转换为 16 进制):
# 线程号 10 转为 16 进制为 a jstack 16783 | grep a
如果线程为 GC 线程(如下图),则通过 jstat 分析和 jmap dump内存日志来分析内存情况:
通过 jstat 查看垃圾回收情况,确认是否频繁 FGC 导致的问题:
# 2 秒一次打印垃圾回收情况 jstat -gc 16783 2000
如果确定是 FGC 导致的问题,则通过 jmap dump 内存(文件可能比较大),通过本地工具来分析:
jmap -dump:format=b,file=/my.dump 16783如果导致 CPU 飙升不是频繁的 FGC,则可能遇到程序中代码运算耗时情况,这种情况,我们通过 jstack 得到线程具体的堆栈信息,结合堆栈信息中定位到的代码行数,应该比较容易分析原因。