Spring Boot 以jar包方式运行在后台及linux在程序在后台运行的方法

首先,为了防止和常用的 Tomcat 8080 端口冲突,将 Spring-boot 项目的端口号设置为 8092。

具体方法:在 application.properties 文件里写 server.port=9090。
然后使用maven命令使用:clean package 打包。
把jar包放到服务器上一个合适的位置。

Spring-boot jar 包方式启动

使用 java -jar spring-boot01-1.0-SNAPSHOT.jar 命令,启动 jar 包。
开放端口,参考我的另一博客
然后,在本地测试一下,看能访问成功。

然而,上面的这种方式,只要控制台关闭,服务就不能访问了。下面我们使得 jar 包在后台运行。

使用以下命令在后台运行,会输出运行的进程id

1
2
nohup java -jar spring-boot01-1.0-SNAPSHOT.jar > log.file 2>&1 &    #运行在后台
exit #退出终端

最后一步退出终端的命令不能少,否则点关闭按钮关闭终端的话,后台程序可能会随之关闭。对于上面的命令的解释:
bash 中 0、1、2 三个数字分别代表 STDIN_FILENO 、 STDOUT_FILENO 、STDERR_FILENO ,即标准输入(一般是键盘),标准输出(一般是显示屏,准确的说是用户终端控制台),标准错误(出错信息输出)。
数字 含义
0 标准输入(一般是键盘)
1 标准输出(一般是显示屏,准确的说是用户终端控制台)
2 标准错误(出错信息输出)

停止服务

控制台输入

1
jps

找到刚才运行的进程id,输入下面的命令关闭进程

1
kill -9 进程id

linux输入输出小知识

输入输出可以重定向

所谓重定向输入就是在命令中指定具体的输入来源,譬如 cat < test.c 将 test.c 重定向为 cat 命令的输入源。输出重定向是指定具体的输出目标以替换默认的标准输出
譬如 ls > 1.txt 将 ls 的结果从标准输出重定向为 1.txt 文本。
有时候会看到如 ls >> 1.txt这类的写法。 > 和 >> 的区别在于:> 用于新建而 >> 用于追加。即 ls > 1.txt 会新建一个 1.txt 文件并且将 ls 的内容输出到新建的 1.txt 中,而 ls >> 1.txt 则用在 1.txt 已经存在,而我们只是想将 ls 的内容追加到 1.txt 文本中的时候。

默认输入只有一个(0,STDIN_FILENO),而默认输出有两个(标准输出1 STDOUT_FILENO,标准错误2 STDERR_FILENO)。

因此默认情况下,shell 输出的错误信息会被输出到2,而普通输出信息会输出到 1。
但是某些情况下,我们希望在一个终端下看到所有的信息(包括标准输出信息和错误信息),
非常直观的想法就是 2>1 (将2重定向到1嘛),行不行呢?试一试就知道了。我们进行以下测试步骤:

1
2
3
4
5
mkdir test && cd test   #创建 test 文件夹并进入 test 目录 步骤1
touch a.txt b.c c #创建 a.txt、b.c、c 三个文件 步骤2
ls > 1 #按我们的猜测,这句应该是将 ls 的结果重定向到标准输出,因此效果和直接 ls 应该一样。但是实际这句执行后,标准输出中并没有任何信息 步骤3
ls #执行 3 之后再次 ls ,则会看到 test 文件夹中多了一个文件 1 步骤4
cat 1 #查看文件1的内容,实际结果为:1 a.txt b.c c 步骤5

可见步骤 3 中 ls > 1 并不是将 ls 的结果重定向为标准输出,而是将结果重定向到了一个文件 1 中。即 1 在此处不被解释为 STDOUT_FILENO,而是文件1。

2>&1 的用意了

2>&1 就是用来将标准错误 2 重定向到标准输出 1 中的。此处 1 前面的 & 就是为了让 bash 将 1 解释成标准输出而不是文件 1 。至于最后一个 & ,则是让 bash 在后台执行。

linux后台执行命令:&和nohup

&

当在前台运行某个作业时,终端被该作业占据;可以在命令后面加上& 实现后台运行。例如:sh test.sh &
在后台运行作业时要当心:需要用户交互的命令不要放在后台执行,因为这样你的机器就会在那里傻等。不过,作业在后台运行一样会将结果输出到屏幕上,干扰你的工作。如果放在后台运行的作业会产生大量的输出,参考上面的linux输入输出小知识定向到某个文件中。

使用&命令后,作业被提交到后台运行,当前控制台没有被占用,但是一但把当前控制台关掉(退出帐户时),作业就会停止运行。
当你成功地提交进程以后,就会显示出一个进程号,可以用它来监控该进程,或杀死它。(ps -ef | grep 进程号 或者 kill -9 进程号)

nohup

nohup命令可以在你退出帐户之后继续运行相应的进程。nohup就是不挂起的意思( no hang up)。该命令的一般形式为:

1
nohup command &

如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到$HOME/nohup.out的文件中,除非另外指定了输出文件

1
nohup command > myout.file 2>&1 &

使用了nohup之后,很多人就这样不管了,其实这样有可能在当前账户非正常退出或者结束的时候,命令还是自己结束了。所以在使用nohup命令后台运行命令之后,需要使用exit正常退出当前账户,这样才能保证命令一直在后台运行。

一些任务执行相关的linux命令

1
2
Ctrl + z  #可以将一个正在前台执行的命令放到后台,并且处于暂停状态
Ctrl+c #终止前台命令

查看运行的后台进程

1
2
jobs      #查看当前有多少在后台运行的命令。 
jobs -l #选项可显示所有任务的PID,jobs的状态可以是running, stopped, Terminated。但是如果任务被终止了(kill),shell 从当前的shell环境已知的列表中删除任务的进程标识。

jobs命令只看当前终端生效的,关闭终端后,在另一个终端jobs已经无法看到后台跑得程序了,此时利用ps(进程查看命令)

查看所有运行的程序

1
ps -ef 或 ps aux

两者没太大差别,讨论这个问题,要追溯到Unix系统中的两种风格,System V风格和BSD 风格,ps aux最初用到Unix Style中,而ps -ef被用在System V Style中,两者输出略有不同。现在的大部分Linux系统都是可以同时使用这两种方式的。

打赏

请我喝杯咖啡吧~

支付宝
微信