[英]Why after that I quit a Spring Boot application in a Linux shell (by CTRL+Z) a process still listen on the 8080 port? (the port used by my application
我正在开发一个在 Linux 机器上运行它的 Spring Boot 应用程序。 它是一个批处理应用程序,包含侦听 8080 端口的Spring Boot 管理工具。
我有以下“问题”:我第一次使用这个命令将它运行到我的 shell 中:
mvn spring-boot:run
它正确启动,我可以在这个地址访问Spring Boot Admin工具面板http://localhost:8080/
假设我通过单击键盘上的CTRL+Z来停止批处理应用程序的执行,因此 Spring Boot 应用程序现在已停止,并且我获得了以下输出消息:
[1]+ Stopped mvn spring-boot:run
好的,现在如果我通过相同的启动命令再次运行我的应用程序:
mvn spring-boot:run
现在我收到此错误消息:
Description:
Web server failed to start. Port 8080 was already in use.
Action:
Identify and stop the process that's listening on port 8080 or configure this application to listen on another port.
因此,如果我执行此命令来查找正在侦听端口 8080 的进程:
andrea@ubuntu:~/git/notartel-api-batch$ netstat -ltnp | grep -w ':8080'
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp6 2 0 :::8080 :::* LISTEN 16269/java
如果现在我杀死了前一个进程,我再次重新启动我的 Spring Boot 应用程序,它将毫无问题地启动。
为什么如果我退出监听 8080 端口的 Spring Boot 应用程序(使用 CTRL+Z 进入 Linux shell),这个进程仍然监听这个端口? 我预计整个应用程序将被杀死并且没有任何东西监听端口
Ctrl + Z
不会终止应用程序,而是将其挂起并将其置于后台,如果要中止正在运行的应用程序,请使用Ctrl + C
我在终端中执行此命令以清除端口 8080 中的进程。
kill `lsof -i -n -P | grep TCP | grep 8080 | tr -s " " "\n" | sed -n 2p`
Ctrl+C 用于杀死带有信号 SIGINT 的进程,换句话说,它是一个礼貌的 kill 。
Ctrl+Z 用于通过向进程发送信号 SIGTSTP 来暂停进程,该信号类似于睡眠信号,可以撤消并且进程可以再次恢复。
但是当一个进程被挂起时,我们可以通过 fg(前台恢复)和 bg(后台恢复)再次恢复它,但我不能恢复一个被杀死的进程,这是使用 Ctrl+C 和 Ctrl+Z 的区别.
如果你正在运行这个
mvn spring-boot:run
在其他一些终端上,如果您关闭 IDE,该进程将不会停止侦听端口。
而不是运行 mvn spring-boot:run 你可以只运行应用程序的主文件。 之后,当您关闭应用程序时,端口将不会侦听。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.