Linux下按CTRL+Z退出Spring Boot应用后8080端口仍被占用是什么原因?
核心原因
你混淆了Linux Shell下常用快捷键的作用,CTRL+Z 并不是终止进程的操作,而是挂起(暂停)进程的操作:被挂起的进程仍然处于存活状态,会持有所有已经申请到的系统资源,包括端口监听、内存、文件句柄等,所以8080端口自然会被持续占用。
Linux Shell前台进程常用快捷键区别
CTRL+C:向前台运行的进程发送SIGINT中断信号,默认逻辑是让进程正常终止退出,进程退出前会主动释放所有持有的系统资源,你要终止运行中的Spring Boot应用,应该使用这个快捷键。CTRL+Z:向前台运行的进程发送SIGTSTP暂停信号,默认逻辑是暂停进程的运行,将进程放到后台的停止任务队列,进程本身不会退出,所有资源都会保留:- 你可以执行
jobs命令看到当前用户会话下所有被挂起的任务 - 执行
fg %任务编号可以把挂起的进程拉回前台继续运行 - 执行
bg %任务编号可以让进程在后台恢复运行
- 你可以执行
问题场景还原
你按下CTRL+Z后,Maven启动的Java进程只是被暂停运行,并没有退出,仍然持有8080端口的监听权限,此时你再次执行启动命令,新的进程就会因为端口被占用启动失败。
解决方案
- 日常要终止前台运行的Spring Boot应用,直接按
CTRL+C即可,进程会正常退出释放端口。 - 如果不小心按了
CTRL+Z挂起了进程,可以选择两种方式处理:- 执行
jobs查看挂起的任务编号,执行kill %任务编号直接终止挂起的进程,释放资源 - 执行
fg把进程拉回前台后,再按CTRL+C正常终止进程
- 执行
内容的提问来源于stack exchange,提问作者AndreaNobili
相关产品推荐
相关产品推荐

