Linux 系统中注册服务的方式
准备环境
-
CentOs 8
-
linux服务器中安装Java 8
-
准备可执行springboot 程序演示
我准备了一个非常简单的springboot应用启动后访问8080端口返回一个简单页面。
将打包的springboot 应用上传到服务器/soft
目录
-
编写一段Shell脚本 控制应用启动|关闭|查看状态
vim /soft/myBoot.sh
内容如下#!/bin/bash # 程序路径 JAR_PATH="/soft" # 服务名称 SERVICE_NAME="springboot-demo-0.0.1-SNAPSHOT.jar" # 输出日志文件 LOG_FILE="/soft/application.log" # 启动函数 start() { # 启动前先停止以防止有已启动情况 stop echo "Starting $SERVICE_NAME..." # 这里编写启动逻辑 java -jar "$JAR_PATH/$SERVICE_NAME" > $LOG_FILE 2>&1 echo "view Log In File $LOG_FILE" } # 停止函数 stop() { echo "Stopping $SERVICE_NAME..." # 这里编写停止逻辑 pid=$(ps aux | grep '[s]pringboot-demo-0.0.1-SNAPSHOT.jar' | awk '{print $2}') if [ -n "$pid" ]; then echo "$SERVICE_NAME pid is $pid" kill "$pid" fi } # 重启函数 restart() { stop start } # $1 表示命令行第一个参数 case "$1" in start) start ;; stop) stop ;; restart) restart ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac
-
给脚本添加执行权限
[root@iZbp1cv33h9zpl0s5k5hwuZ soft]# chmod +x /soft/myBoot.sh
一、systemd 方式注册服务 (推荐方式)
-
创建systemd服务单元配置文件
这个文件是用来描述如何启动、管理和监控你的程序的服务单元.# 创建单元服务文件 touch /usr/lib/systemd/system/myBoot.service
-
编写服务单元配置文件
# 单元服务配置规则 [Unit] Description=xxx # 描述你的文件是干什么的 After=network.target #这个代表网络服务启动完毕后,再启动程序 # 可根据需要添加依赖的服务,例如:After=mysqld.service xxx xx2 多的用空格隔开 [Service] ExecStart=/path/to/img1.2 # 替换为你的二进制文件的实际路径 也可以是脚本文件.sh Restart=on-failure # 如果程序崩溃则自动重启 RestartSec=5 # 重启间隔时间 User=<username> # 运行此服务的用户,默认可以是root,也可以指定其他非特权用户 可 以不填 Group=<groupname> # 运行此服务的组,默认与User相同 可以不填 Type=simple # 对于大多数二进制文件来说,Type=simple即可 及跑一次一直运行 # 根据程序需求,可能需要环境变量设置,如: Environment="VAR_NAME=value" #无要求可删 [Install] WantedBy=default.target # 表示随系统启动时加载该服务
根据以上规则编写我们的单元服务配置
vim /usr/lib/systemd/system/myBoot.service
写入以下内容保存
[Unit] #服务描述 Description=myBoot XX系统 #依赖服务 该服务应该在哪些服务之后启动。 After=network.target [Service] # 设置 systemctl start myBoot.service 执行命令 ExecStart=/soft/myBoot.sh start # 设置 systemctl stop myBoot.service 执行命令 ExecStop=/soft/myBoot.sh stop # 设置 systemctl reload myBoot.service 执行命令 ExecReload=/soft/myBoot.sh restart # 重启 Restart=on-failure RestartSec=10 Type=simple [Install] WantedBy=default.target
-
给单元服务文件添加权限
chmod 777 /usr/lib/systemd/system/myBoot.service
-
加载单元服务文件
systemctl daemon-reload
-
启动服务
# 启动服务 .service 可写可不写 systemctl start myBoot
# 查看运行状态 active (running) 表示运行中 [root@iZbp1cv33h9zpl0s5k5hwuZ soft]# systemctl status myBoot ● myBoot.service - myBoot XX系统 Loaded: loaded (/usr/lib/systemd/system/myBoot.service; disabled; vendor preset: disabled) Active: active (running) since Thu 2024-06-06 22:59:53 CST; 59s ago Main PID: 2902 (myBoot.sh) Tasks: 28 (limit: 11426) Memory: 220.6M CGroup: /system.slice/myBoot.service ├─2902 /bin/bash /soft/myBoot.sh start └─2907 java -jar /soft/springboot-demo-0.0.1-SNAPSHOT.jar Jun 06 22:59:53 iZbp1cv33h9zpl0s5k5hwuZ systemd[1]: Started myBoot XX系统. Jun 06 22:59:53 iZbp1cv33h9zpl0s5k5hwuZ myBoot.sh[2902]: Stopping springboot-demo-0.0.1-SNAPSHOT.jar... Jun 06 22:59:53 iZbp1cv33h9zpl0s5k5hwuZ myBoot.sh[2902]: Starting springboot-demo-0.0.1-SNAPSHOT.jar... [root@iZbp1cv33h9zpl0s5k5hwuZ soft]#
#验证启动状态 #我们访问这个springboot应用的接口 [root@iZbp1cv33h9zpl0s5k5hwuZ soft]# curl localhost:8080 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> div{ height: 250px; line-height: 250px; text-align: center; } </style> </head> <body> <div> <h1>Hello Spring Boot</h1> </div> </body> </html> # 可以看到已经返回了内容
#可以将服务设置开机自启 系统开机时自动启动该服务 systemctl enable myBoot.service
二、service /etc/init.d/ 方式注册服务
-
移除上面的systemctl 服务配置
# 删除配置 rm -rf /lib/systemd/system/myBoot.service # 重新加载配置 systemctl daemon-reload
-
创建服务脚本
# 创建脚本文件 touch /etc/init.d/springboot
-
编写脚本内容
vim /etc/init.d/springboot
写入以下内容
#!/bin/bash # 程序路径 JAR_PATH="/soft" # 服务名称 SERVICE_NAME="springboot-demo-0.0.1-SNAPSHOT.jar" # 输出日志文件 LOG_FILE="/soft/application.log" # 启动函数 start() { stop echo "Starting $SERVICE_NAME..." # 这里编写启动逻辑 java -jar "$JAR_PATH/$SERVICE_NAME" > $LOG_FILE 2>&1 echo "view Log In File $LOG_FILE" } # 停止函数 stop() { echo "Stopping $SERVICE_NAME..." # 这里编写停止逻辑 pid=$(ps aux | grep '[s]pringboot-demo-0.0.1-SNAPSHOT.jar' | awk '{print $2}') if [ -n "$pid" ]; then echo "$SERVICE_NAME pid is $pid" kill "$pid" fi } # 重启函数 restart() { stop start } # $1 表示命令行第一个参数 case "$1" in start) start ;; stop) stop ;; restart) restart ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac
-
添加脚本执行权限
chmod +x /etc/init.d/springboot
-
启动服务
# /etc/init.d/下的服务 将由service 管理 # service springboot start|stop|restart 的 start|stop|restart 不是像 systemd 固定的,而是传入脚本的参数,由脚本决定 # 启动 service springboot start # 验证启动状态,访问接口成功访问 [root@iZbp1cv33h9zpl0s5k5hwuZ ~]# curl localhost:8080 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> div{ height: 250px; line-height: 250px; text-align: center; } </style> </head> <body> <div> <h1>Hello Spring Boot</h1> </div> </body>
# 停止 service springboot stop
# 重启 service springboot restart
三、chkconfig 方式注册服务
这种方式在老版本的CentOS中广泛使用,但是现在大部分发行版都不使用chkconfig 管理服务。
这里就简单提一提,有兴趣的可以研究研究。
-
创建服务脚本
首先,你需要一个服务脚本。这个脚本通常放在 /etc/init.d/ 目录下,脚本名称通常是服务的名字。服务脚本需要包含至少启动 (start)、停止 (stop)、重启 (restart) 函数,并且要有 chkconfig 需要识别的注释行来指定服务的运行级别和启动/关闭优先级。一个简单的服务脚本模板如下所示:
#!/bin/bash # chkconfig: 345 90 10 # description: My Awesome Service start() { # 启动服务的命令 echo "Starting My Awesome Service..." } stop() { # 停止服务的命令 echo "Stopping My Awesome Service..." } restart() { stop start } case "$1" in start) start ;; stop) stop ;; restart) restart ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 esac exit 0
确保脚本具有执行权限,可以通过以下命令设置:
chmod +x /etc/init.d/服务名
-
注册服务
使用 chkconfig --add 命令将服务脚本添加到 chkconfig 的管理系统中:
chkconfig --add 服务名
-
设置服务的启动级别
接下来,你可以使用 chkconfig 命令来设置服务在哪些运行级别上启动。如果不指定运行级别,默认是所有预定义的运行级别。例如,要让服务在运行级别3和5上启动,可以执行:
chkconfig --level 35 服务名 on
-
验证
最后,你可以使用 chkconfig --list 服务名 来检查服务是否成功注册,并查看其在各运行级别的状态。
四、总结
目前大部分系统都默认使用Systemd管理服务,推荐使用第一种方式。第二种方式不支持开机自启 可以配合chkconfig 设置开机自启。service、chkconfig 旧版本用的多。