进程管理
这里列举一些做线上排查经常会用到的一些命令。
什么是进程(Process)?
在开始前要先了解什么是进程。
当你执行:
java -jar app.jarLinux会创建一个:
Java进程(Process)其他程序也是如此:
Linux
├── nginx
├── mysql
├── redis
├── java ← Spring Boot
└── ssh每运行一个程序,就是一个进程。
所以,Spring Boot 项目的本质就是一个 Java 进程。
ps(查看进程)
查看所有进程
ps -ef输出案例:
UID PID PPID CMD
root 1001 1 java -jar app.jar
root 1002 1 nginx
root 1003 1 redis-server这里最重要的是 PID(进程编号)。
这相当于这个进程的身份编码,后需要杀死进程时也是用这个编号。
查看java进程
ps -ef | grep javaroot 1001 java -jar app.jar查看Spring Boot是否启动
例如:
java -jar demo.jar不知道是否成功启动
执行:
ps -ef | grep demo如果看到
java -jar demo.jar说明已经启动,否则说明没有成功启动。
top(查看资源)
如果服务器卡了,不知道哪里占用资源,可以用 top 命令查看。
top输出案例:
PID CPU% MEM%
1001 95 20
1002 2 3
1003 1 5CPU% 代表CPU占有率,MEM% 代表内存占有率
占用最高的进程是 1001,上面的案例中这个进程是 java 进程,那么代表 Java 很可能出现了问题。
退出:q
kill(结束进程)
java卡死了,怎么结束呢?
上面的案例中 Java 的 PID 是 1001,那么就可以用 kill 命令结束进程。
kill 1001如果没结束,可以使用 kill -9 强制结束。
kill -9 1001工作流程
例如:现在有一个 Spring Boot 项目卡死了。
第一步:查看PID
ps -ef | grep java得到:
PID=1001第二部:杀死进程
kill -9 1001第三步:重启项目
java -jar app.jarkill 和 kill -9 有什么区别?
kill 是正常结束进程,kill -9 是强制结束进程。
kill
↓
通知程序:
"请退出"kill 在正式退出前会进行询问。程序可以保存数据,关闭资源,也可以拒绝退出。
kill -9 是强制结束进程,不会询问,直接结束。
kill -9
↓
操作系统直接杀掉所以一般先 kill,不行再 kill -9
ss(查看端口)
以前使用 netstat 命令查看端口,但是现在推荐使用 ss 命令。
查看监听端口
ss -lnt输出案例:
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
...
LISTEN 0 511 127.0.0.1:6379 0.0.0.0:*
LISTEN 0 150 *:3306 *:*
LISTEN 0 100 *:8080 *:*
...一般来说:
8080: Spring Boot
3306: MySQL
6379: Redis查看哪个程序占用了端口
ss -lntp输出案例
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
...
LISTEN 0 100 *:8080 *:* users:(("java",pid=3977831,fd=20))
...重要内容:
8080 users:(("java",pid=3977831,fd=20))它代表的含义是:
8080端口
↓
Java
↓
PID
1001运行环境案例
Java项目启动失败
报错:
Port 8080 already in use8080端口已经被占用。
第一步:查看进程
ss -lntp查看哪个程序占用了端口
8080
↓
PID
1001第二步: 结束进程
如果确认此程序可以被关闭,可以使用 kill 命令结束进程,为 Java 程序让出位置。
kill 1001重新运行 Java 程序。
CPU100%
服务器 CPU 占用率 100%时。
第一步:top查看占用情况
topPID CPU% MEM%
1001 95 20
1002 2 3
1003 1 5发现 1001 占用了95%
第二步:查看进程所代表的程序
ps -ef | grep 1001发现是 Java 程序。
再结合 jstack 分析线程。
Java 没启动
ps -ef | grep java没有任何结果,说明程序没有运行。