如何正确的启动停止SpringBoot Jar,解决端口被占用、终端退出后不停止服务

接触SpringBoot项目之后,一直就没弄清楚到底如何正确的启动、停止Jar包,只知道简单 java -jar demo.jar命令, 遇到过好多问题,比如在linux服务器上启动成功后“终端窗口”关闭了或ctrl+c退出后服务就没了;在window系统中远程上去在命令行启动后,关闭窗口服务没了,没正确关闭端口被占用了等等。期间也百度了一些脚本来启动停止jar服务,但是作为一个想靠技术吃饭的程序员我们还是要弄清楚其中的原因和一些命令的含义。

在终端输入 

[ebs@iZuf6hn5rqfkkx9usnpapnZ web_server]$ java -jar demo-0.0.1-SNAPSHOT.jar 

这个是最简单的启动一个jar ,启动后会在终端输出日志(当前端口不能在输入了),如果此时ctrl + c 退出当前进程或关闭终端,服务也就没有了。这显然不是我们需要的,在服务器上不可能一直运行这终端,如果是远程终端就更不可能了。那如何解决这个问题,就需要用 nohup & 联合起来使用了。

&指令: 指后台运行。

nohup指令:

nohup官网介绍:http://www.gnu.org/software/coreutils/manual/html_node/nohup-invocation.html#nohup-invocation

runs the given command with hangup signals ignored, so that the command can continue running in the background after you log out. Synopsis:

在忽略挂起信号的情况下运行给定的命令,以便在注销后命令可以在后台继续运行。

可以这么理解:nohup 不挂断的运行,注意并没有后台运行的功能,就是指,用nohup 运行命令可以是命令永远运行下去。


下面举几个例子:

example1:

nohup java -jar demo.jar

ssh连接中,运行这条指令,你会发现进程中有了demo.jar 这条进程,但它并不在后台运行
这时你无法在当前ssh连接中进行其他命令,因为它不是后台运行,你ctrl+c,这条进程会消失。
所以nohup 并不支持后台运行,它是忽略内部的挂断信号,不挂断运行

那么

nohup COMMAND & 

把 nohup与& 结合在一起,这样就可以不挂断的永久在后台执行

example 2

nohup java -jar demo.jar 2>&1 &

执行成功后会提示:nohup: 忽略输入并把输出追加到"nohup.out"

  • 不挂断的后台启动 demo.jar,
  • "2>&1" 表示 错误和输出都传到nohup.out文件中,默认状态只把输出输出到nohup.out文件中
  • nohup 命令默认输出到nohup.out文件中

example 3

nohup java -jar demo.jar >./log.txt  2>&1 &
  • 默认输出文件修改为当前目录下 log.txt文件。大多数情况下Jar中都会使用log-back来把日志输出到指定位置,而这样启动的话 两个地方都在打印同样的日志,要做进一步优化:不输出日志,只保留jar中配置的日志即可
nohup java -jar demo.jar > /dev/null 2>&1 &

停止服务:

   1、linux环境下查看当前jar的运行进程:  ps -ef | grep  demo.jar

[ebs@iZuf6hn5rqfkkx9usnpapnZ web_server]$ ps -ef|grep ebs-0.0.1-SNAPSHOT.jar 
ebs       2202     1  0 12月19 ?      00:00:59 java -jar /home/ebs/web_server/ebs-0.0.1-SNAPSHOT.jar
ebs       4749  4496  0 09:16 pts/0    00:00:00 grep --color=auto ebs-0.0.1-SNAPSHOT.jar

找到后,杀死进程: kill -9 pid

[ebs@iZuf6hn5rqfkkx9usnpapnZ web_server]$ kill -9 2202

2、在win中,直接启动任务管理器 关停 java.exe即可

端口被占用

 有时候服务未正常关闭或其他原因端口被占用,jar启动不了,终端会输出端口被占用。

可以通过 netstat -anp 查看所有端口:

我的jar端口是9000,PID 是2202,杀死2202进程即可。其中6379是redis,22是ftp连接,5432是postgreSql 端口。

也可以直接查看9000端口 

[ebs@iZuf6hn5rqfkkx9usnpapnZ web_server]$ netstat -an |grep 9000
tcp        0      0 0.0.0.0:9000            0.0.0.0:*               LISTEN     
tcp        0      0 172.19.76.138:9000      218.94.145.18:7834      ESTABLISHED
tcp        0      0 172.19.76.138:9000      218.94.145.18:7833      TIME_WAIT  
tcp        0      0 172.19.76.138:9000      122.96.41.170:59024     ESTABLISHED
发布了49 篇原创文章 · 获赞 19 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/shenju2011/article/details/103626433