需求:部署Java应用为自启动服务(添加开机启动项)
以部署xx_SOAP_NANSHA.jar 为例子。
服务器信息
systemctl 新增服务:
进入system目录创建service启动文件.
cd /usr/lib/systemd/system
#cd /etc/systemd/system
touch nansha.service
配置service:vi nansha.service
[Unit]
Description=nansha
After=syslog.target network.target
[Service]
Type=simple
#ExecStart=/home/JarRun/nansha/start.sh
ExecStart=/usr/bin/nohup /usr/local/btjdk/jdk8/bin/java -Xms1024m -Xmx1024m -Xmn256m -XX:MaxDirectMemorySize=5G -jar /home/JarRun/nansha/xxx_SOAP_NANSHA-0.0.1-SNAPSHOT.jar > /home/JarRun/nansha/PUSHAPI.log 2>&1 & echo $! > /home/JarRun/nansha/PUSHAPI.txt
#ExecStop=/home/JarRun/nansha/stop.sh
Restart=always
RestartSec=300
StartLimitBurst=3
User=root
Group=root
#配置工作目录,默认是~。服务产生得文件、日志信息会存入到工作目录
WorkingDirectory=/home/JarRun/nansha
[Install]
WantedBy=multi-user.target
开机启动systemctl enable nansha
[root@localhost system]# systemctl enable nansha
Created symlink from /etc/systemd/system/multi-user.target.wants/nansha.service to /usr/lib/systemd/system/nansha.service.
启动服务: systemctl start nansha
重启服务systemctl restart nansha
查看该服务的状态:systemctl status nansha
停止服务并从自启动项中删除
sudo systemctl stop nansha
sudo systemctl disable nansha
查看服务日志信息:journalctl -xe
查看启动进程: ps -ef |grep xxx.jar
#!/bin/sh
# ssh-copy-id -i ~/.ssh/mac_id_rsa.pub root@192.168.0.14
# 定义远程服务器的用户名和IP地址
REMOTE_HOST="25"
#path
REMOTE_PATH="/home/JarRun/nansha/_SOAP_NANSHA-0.0.1-SNAPSHOT.jar"
LOCAL_PATH="/Users/feitong/Downloads/zkn-es/CT_SOAP_NANSHA/target/_SOAP_NANSHA-0.0.1-SNAPSHOT.jar"
scp -o StrictHostKeyChecking=no $LOCAL_PATH $REMOTE_HOST:$REMOTE_PATH #1. 上传jar包
# 要执行的远程命令
REMOTE_COMMAND=" systemctl restart nansha"
#echo $REMOTE_COMMAND
ssh -o StrictHostKeyChecking=no $REMOTE_HOST $REMOTE_COMMAND # 2. 重启服务
# 脚本执行完毕,退出状态为0
exit 0
#nohup command & # 在后台运行command,忽略挂起信号
nohup /usr/bin/journalctl -f -u gd_push.service >> /home/JarRun/PUSHAPI/log.txt 2>&1 &
nohup /usr/bin/journalctl -f -u changle_kafka.service >> /home/JarRun/PUSHAPI_Kafka/log.txt 2>&1 &
# journalctl 持续监听新的日志条目,可以添加-f参数
chmod a+x start.sh
#!/bin/bash
# 写Java命令的绝对路径,方便SSH远程操作。/usr/local/btjdk/jdk8/bin/java
nohup /usr/local/btjdk/jdk8/bin/java -Xms1024m -Xmx1024m -Xmn256m -XX:MaxDirectMemorySize=5G -jar SOAP-0.0.1-SNAPSHOT.jar > PUSHAPI.log 2>&1 & echo $! > PUSHAPI.txt
推荐使用绝对路径,方便ssh远程执行
#!/bin/bash
echo "start"
/usr/bin/nohup /usr/local/btjdk/jdk8/bin/java -Xms1024m -Xmx1024m -Xmn256m -XX:MaxDirectMemorySize=5G -jar /home/JarRun/nansha/xx_SOAP_NANSHA-0.0.1-SNAPSHOT.jar > /home/JarRun/nansha/PUSHAPI.log 2>&1 & echo $! > /home/JarRun/nansha/PUSHAPI.txt
#exit 0
echo "start done"
#!/bin/bash
PID=$(cat PUSHAPI.txt)
kill -9 $PID
#如果想要不报错,在后面加上其他指令即可:
echo "执行完毕"
推荐使用绝对路径,方便ssh远程执行
#!/bin/bash
PID=$(cd /home/JarRun/nansha && cat PUSHAPI.txt)
/usr/bin/kill -9 $PID 2>devnull || echo "done"
exit 0
#!/bin/sh
# ssh-copy-id -i ~/.ssh/mac_id_rsa.pub root@192.168.0.14
# 定义远程服务器的用户名和IP地址
REMOTE_HOST="25"
#path
REMOTE_PATH="/home/JarRun/nansha/_SOAP_NANSHA-0.0.1-SNAPSHOT.jar"
LOCAL_PATH="/Users/feitong/Downloads/zkn-es/CNFT_SOAP_NANSHA/target/_SOAP_NANSHA-0.0.1-SNAPSHOT.jar"
scp -o StrictHostKeyChecking=no $LOCAL_PATH $REMOTE_HOST:$REMOTE_PATH
# 要执行的远程命令
REMOTE_COMMAND=" /home/JarRun/nansha/stop.sh && /home/JarRun/nansha/start.sh"
#echo $REMOTE_COMMAND
ssh -o StrictHostKeyChecking=no $REMOTE_HOST $REMOTE_COMMAND
# 脚本执行完毕,退出状态为0
exit 0
build中的plugins,它定义了 spring-boot-maven-plugin 插件的使用,用于将项目打包成可执行的 JAR 文件,并执行其他与 Spring Boot 相关的任务。
1:<plugin>
标签:这是 Maven 构建工具用来定义插件的起始标签。在这个标签内,可以配置插件的详细信息; 2:<groupId>
和 <artifactId>
:这两个标签指定了插件的坐标(Coordinates),即插件的唯一标识符。在这里,org.springframework.boot 是插件的 Group ID,spring-boot-maven-plugin 是插件的 Artifact ID。这些信息用于在 Maven 仓库中定位并下载插件。3:<configuration>
标签:这个标签包含了插件的配置信息。
<mainClass>
标签:指定了 Spring Boot 应用程序的主类,主类是 Spring Boot 应用程序的入口点,即可执行 JAR 文件的入口点,当你运行 JAR 文件时,这个类的 main 方法会被执行。在这个例子中,主类是 com.lucky.PracticeApplication
一个JAR文件通常包含一个名为MANIFEST.MF的清单文件,这个文件定义了关于JAR文件的各种元数据
没有包含BOOT-INF
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
解决方式: maven打包是配置信息不能跳过,去掉configuration标签的skip
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.xxx.xx_soap_nansha.SoapNanshaApplication</mainClass>
<!-- <skip>true</skip>-->
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Archiver-Version: Plexus Archiver
Built-By: Administrator
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
Start-Class: com.xx.soap.SoapApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 2.7.6
Created-By: Apache Maven 3.8.1
Build-Jdk: 1.8.0_91
Main-Class: org.springframework.boot.loader.JarLauncher
开发时期的项目里,src/main/下面的java和resources文件夹都被(编译)打包到了生产包的WEB-INF/classes/目录下;而原来WEB-INF下面的views和web.xml则仍然还是在WEB-INF下面。同时由maven引入的依赖都被放入到了WEB-INF/lib/下面。最后,编译后的class文件和资源文件都放在了classes目录下。
lib/systemd/system /run/systemd/system /etc/systemd/system 这三个目录的配置文件优先级依次从低到高,如果同一选项三个地方都配置了,优先级高的会覆盖优先级低的。
系统安装时,默认会将unit文件放在/lib/systemd/system目录。
在/usr/lib/systemd/system目录自动存放启动文件的配置,里面一般包含有*.service的文件:
如果想要修改系统默认的配置,比如nginx.service,一般有两种方法:
1、在/etc/systemd/system目录下创建nginx.service文件,里面写上我们自己的配置。
在/etc/systemd/system下面创建nginx.service.d目录,在这个目录里面新建任何以.conf结尾的文件,然后写入自己的配置。推荐这种做法。
2、/run/systemd/system这个目录一般是进程在运行时动态创建unit文件的目录,一般很少修改,除非是修改程序运行时的一些参数时,即Session级别的,才在这里做修改。
[Unit]:服务的全局信息和依赖性声明,如服务名称、描述等。
[Service]:指定服务的具体配置,如服务执行的命令、工作目录等。
[Install]:指定服务的安装方式,如服务的启动级别等。
Description:对服务的简短描述。
Before:定义服务在其他服务之前启动。
After:定义服务在其他服务之后启动。
Requires:定义服务启动需要哪些其他服务已启动,否则无法启动。
PartOf:定义该服务是其他服务的一部分,如果其他服务停止,该服务也会停止。
Wants:定义服务启动时可同时启动哪些其他服务。
Condition...:定义服务启动的条件,如ConditionPathExists表示某个路径存在时才启动该服务。
Type:服务类型,可以是simple、forking、ondemand、notify等。
ExecStart:服务启动命令,可以是单个命令、脚本文件、或者多个命令组成的脚本。
ExecStop:停止服务的命令。
User:定义服务运行的用户。
Group:定义服务运行的用户组。
PrivateTmp:将服务的/tmp目录挂载到私有的命名空间中,以增强安全性。
Restart:定义服务异常退出时如何重启。
WorkingDirectory:定义服务工作目录。
Environment:定义服务的环境变量等。
ProtectSystem:防止服务对系统文件进行修改。
NoNewPrivileges:防止服务通过setuid或setgid等提升权限。
WantedBy:定义在哪些系统运行级别下启用此服务。
RequiredBy:启动其他系统服务时必需启动此服务。
vi /etc/systemd/system/myservice.service
[Unit]
Description=MyService
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/myservice
WorkingDirectory=/var/myservice
User=myservice
Group=myservice
Restart=always
RestartSec=30
StartLimitInterval=400
StartLimitBurst=3
[Install]
WantedBy=multi-user.target
定义了一个名为"MyService"的服务,服务启动时执行/usr/bin/myservice命令,执行工作目录为/var/myservice,运行用户为myservice。如果服务异常退出,则每30秒尝试重新启动,最多尝试3次。最后,服务将在多用户运行级别下启用。
使用systemctl重启服务
sudo systemctl restart <服务名>
To force a start use "systemctl reset-failed nansha.service" followed by "systemctl start nansha.service" again.
重启服务
systemctl reset-failed nansha.service && systemctl start nansha.service
列出所有服务
sudo systemctl list-unit-files --type=service
重载配置
Warning: nansha.service changed on disk. Run 'systemctl daemon-reload' to reload units.
查看错误信息
journalctl -xe
systemd是Linux系统中广泛使用的系统和服务管理器,它以journal的形式记录系统和应用程序的日志。
持续监听新的日志条目,可以添加-f参数
/usr/bin/nohup journalctl -f -u gd_push.service >> /home/JarRun/PUSHAPI/log.txt 2>&1
获取特定时间段的日志,可以使用--since和--until参数
journalctl -u my-custom-service.service --since "2023-03-01 00:00:00" --until "2023-03-02 00:00:00"
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有