繁体   English   中英

为什么之后我在 Linux shell 中退出 Spring Boot 应用程序(通过 CTRL+Z)一个进程仍然监听 8080 端口? (我的应用程序使用的端口

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM