SpringBoot生成的jar包后台执行


原文链接: SpringBoot生成的jar包后台执行

java -jar -server -Djava.awt.headless=true -Xms1g -Xmx1g -Dspring.profiles.active=prod -Djava.security.egd=file:///dev/urandom -Dspring.config.location=/home/podium/uaa-config.yml /home/podium/podium-uaa.war

chmod +x /etc/systemd/system/shizhi.service
systemctl daemon-reload

/lib/systemd/system/lzkp@.service

[Unit]
Description=workServer Service
After=rc-local.service

[Install]
WantedBy=multi-user.target
Alias=backend.service

[Service]
WorkingDirectory=/docker/bianban/files
ExecStart=/usr/bin/java -jar -Djava.security.egd=file:/dev/./urandom /docker/bianban/files/backendv4.jar --debug --spring.datasource.url="jdbc:mysql://127.0.0.1:3306/shizhi?useUnicode=true&characterEncoding=utf-8&useSSL=false" --server.servlet.context-path="/backend/shizhi" --spring.datasource.username=lzkp --spring.datasource.password=passw0rd --server.port=1301
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-abort
RestartSec=60s


java -jar -Djava.security.egd=file:/dev/./urandom backendv4.jar --debug \
--spring.datasource.url="jdbc:mysql://localhost:3306/shizhi?useUnicode=true&characterEncoding=utf-8&useSSL=false" \
--spring.datasource.username=lzkp \
--spring.datasource.password= 


nohup java -jar -Djava.security.egd=file:/dev/./urandom $PROJECT_DIR/backendv4/backendv4.jar --debug \
--spring.datasource.url="jdbc:mysql://\${DB_HOST}:\${DB_PORT}/\${DB_DATABASE}?useUnicode=true&characterEncoding=utf-8&useSSL=false" \
--server.servlet.context-path="/$ADMIN_BASEURL/\$NAME" \
--spring.datasource.username=\${DB_USER} \
--spring.datasource.password=\${DB_PASSWORD} \
--server.port=\$ADMIN_PORT >/tmp/$PROJECT_NAME/log.\$NAME 2> /tmp/$PROJECT_NAME/err.\$NAME < /dev/null &

spring.bat
java -Djava.security.egd=file:/dev/./urandom -jar backendv4.jar --debug \
--spring.datasource.url="jdbc:mysql://192.168.5.100:3306/tancheng?useUnicode=true&characterEncoding=utf-8&useSSL=false" \
--server.servlet.context-path="tancheng" \
--spring.datasource.username="lzkp" \
--spring.datasource.password=" " \
--server.port=80 >/log.txt 

一、java -jar直接运行
方式一

java -jar app.jar
特点:当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出
那如何让窗口不锁定?
方式二 &

java -jar app.jar &
&代表在后台运行。
特定:当前ssh窗口不被锁定,但是当窗口关闭时,程序中止运行。
继续改进,如何让窗口关闭时,程序仍然运行?
方式三 nohup命令

语法:nohup Command [ Arg ... ] [ & ]
描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部。
nohup java -jar app.jar &
nohup 意思是不挂断运行命令,当账户退出或终端关闭时,程序仍然运行
方式四 指定输出文件

默认输出到nohup.out文件
**nohup java -jar app.jar >output 2>&1 & **
解释:
操作系统中有三个常用的流:
0:标准输入流 stdin
1:标准输出流 stdout
2:标准错误流 stderr
一般当我们用 > output,实际是 1>output的省略用法;< input ,实际是 0 < input 的省略用法。
带&的命令行,即使terminal(终端)关闭,或者电脑死机程序依然运行(前提是你把程序递交到服务器上);
2>&1的意思
这个意思是把标准错误(2)重定向到标准输出中(1),而标准输出又导入文件output里面,所以结果是标准错误和标准输出都导入文件output里面了。
至于为什么需要将标准错误重定向到标准输出的原因,那就归结为stderr没有缓冲区,而stdout有。这就会导致 >output 2>output 文件output被两次打开,而stdout和stderr将会竞争覆盖。
这就是为什么有人会写成:nohup ./command.sh >output 2>output出错的原因了
jobs命令 查看后台运行任务
fg命令 将某个作业调回前台控制
二、系统服务

在Spring Boot的Maven插件中,还提供了构建完整可执行程序的功能,什么意思呢?就是说,我们可以不用java -jar,而是直接运行jar来执行程序。这样我们就可以方便的将其创建成系统服务在后台运行了。
主要步骤如下:

1、在pom.xml中添加Spring Boot的插件,并注意设置executable配置
```xml
<plugin>    
    <groupId>org.springframework.boot</groupId>   
    <artifactId>spring-boot-maven-plugin</artifactId>    
    <configuration>       
        <executable>true</executable>    
    </configuration>
</plugin>

如果使用是gradle,需要包含下面配置

springBoot {
    executable = true
}

2、在完成上述配置后,使用mvn package进行打包,构建一个可执行的jar包

3、给jar包授权
chmod u+x app.jar
4、创建软连接到/etc/init.d/目录下
ln -s /usr/local/app/app.jar /etc/init.d/app
5、在完成软连接创建之后,我们就可以通过如下命令对app.jar应用来控制启动、停止、重启操作了
service app start|stop|restart|status
默认的应用pid:/var/run/app/app.pid
默认的日志目录:/var/log/app.log
自定义配置

在启动的时候选择读取不同的配置文件

java -jar app.jar --spring.profiles.active=dev

也可以在启动的时候设置jvm参数

java -Xms10m -Xmx80m -jar app.jar &

在jar包相同路径下创建一个同名.conf文件,名称应该与app.jar的名称相同,如app.conf
在其中配置相关变量,如:

LOG_FOLDER=/usr/local/app/logs/console //指定控制台输出到文件
RUN_ARGS="--server.port=8080 --spring.profiles.active=dev"
JAVA_OPTS="-Ddubbo.registry.address=127.0.0.1:2181 -Ddubbo.protocol.port=20887 -Ddubbo.application.name=j-provider -Ddubbo.monitor.protocol=registry"

安全设置

为服务创建一个独立的用户bootapp,同时该用户的shell绑定为/usr/sbin/nologin
把app.jar的所有者设为bootapp:chown bootapp:bootapp app.jar
赋予最小权限:chmod 500 app.jar
禁止修改:chattr +i app.jar
对app.conf文件做如下处理: chmod 400 app.conf;chown root:root app.conf

FAQ:
1、Unable to find Java

解决方法:建立java命令的软链接到/sbin,如:ln -s /usr/local/jdk/bin/java /sbin/java

参考:
http://blog.csdn.net/qq_30739519/article/details/51115075
http://www.cnblogs.com/zq-inlook/p/3577003.html
http://blog.didispace.com/spring-boot-run-backend/

作者:willeyao
链接:https://www.jianshu.com/p/563497a6e1a7
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

`