提问者:小点点

为什么在那之后,我退出了Linuxshell中的Spring Boot应用程序(由CTRL Z),进程仍然侦听8080端口?(我的应用程序使用的端口


我正在处理一个在Linux机器上运行的Spring Boot应用程序。它是一个批处理应用程序,包含在8080端口上侦听的Spring Boot Admin工具。

我有以下“问题”:我第一次使用此命令将其运行到我的shell中:

mvn spring-boot:run

它正确启动,我可以在这个地址访问Spring Boot Admin工具面板http://localhost:8080/

假设我停止批处理应用程序执行,单击键盘上的CTRL Z,因此Spring Boot应用程序现在停止并获得此输出消息:

[1]+  Stopped                 mvn spring-boot:run

好的,现在如果我通过相同的start命令再次运行我的应用程序:

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应用程序(在Linuxshell中使用CTRL Z),这个过程仍然监听这个端口?我预计整个应用程序将被杀死,端口上没有任何监听


共3个答案

匿名用户

Ctrl Z不会杀死应用程序,而是将其挂起并放在后台,如果要中止正在运行的应用程序,请使用Ctrl C

匿名用户

我在终端中执行此命令以清除端口8080中的进程。

kill `lsof -i -n -P | grep TCP | grep 8080 | tr -s " " "\n" | sed -n 2p`

Ctrl C用于终止带有信号SIGINT的进程,换句话说,它是一个礼貌的终止。

Ctrl Z用于通过向进程发送信号SIGTSTP来暂停进程,这就像一个睡眠信号,可以撤消并再次恢复进程。

但是当一个进程被挂起时,我们可以通过fg(前台恢复)和bg(后台恢复)再次恢复它,但是我不能恢复一个被杀的进程,这是使用Ctrl C的区别

匿名用户

如果你在运行这个

 mvn spring-boot:run

在其他终端上,如果您关闭IDE,进程将不会停止侦听端口。

您可以只运行应用程序的Main文件而不是运行mvn spring-boot: run。之后,当您关闭应用程序时,端口将不会侦听。