我正在处理一个在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),这个过程仍然监听这个端口?我预计整个应用程序将被杀死,端口上没有任何监听
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。之后,当您关闭应用程序时,端口将不会侦听。