CentOS 7自定义系统服务(以Phoebus-Olog为例)
需要开启的服务:
- MongoDB
- ElasticSearch
- Phoebus-Olog后端服务
- Phoebus-Olog-web-client前端服务
配置系统服务的方式:
systemd
把spring-boot项目配置为Linux systemd服务
SpringBoot2.X 实战12-安装为systemd服务部署
正确、安全地停止SpringBoot应用服务
优雅的启动、停止、重启你的SpringBoot项目
spring boot 打成 jar 包采用 systemctl 设置自启动
springboot启动脚本start.sh和停止脚本 stop.sh
1. 创建服务启停脚本
创建脚本 /home/dongxw/modules/olog/phoebus-olog-master/phoebus-olog-service.sh,用于启停相应服务:
### This script is used to start/stop Phoebus-Olog service.MONGODB_HOME=/home/dongxw/mongodb-linux-x86_64-rhel70-5.0.6ES_HOME=/home/dongxw/elasticsearch-6.8.4
ES_PORT=9200
ES_USER=dongxwBACKEND_PORT=8080
BACKEND_DIR=/home/dongxw/modules/olog/phoebus-olog-master
JAVA_HOME=/home/dongxw/jdk-16.0.2
JAR_PACK=service-olog-2.0.5-SNAPSHOT.jar
BACKEND_LOG_DIR=$BACKEND_DIR/logsFRONTEND_PORT=3000
FRONTEND_DIR=/home/dongxw/modules/olog/phoebus-olog-web-client-1.0.6## Start MongoDB.
function start_mongodb
{cd $MONGODB_HOME./bin/mongod --dbpath db --logpath log/mongod.log -fork
}## Stop MongoDB.
function stop_mongodb
{pid=`ps -ef | grep mongod | grep -v grep | awk '{print $2}'`kill $pid
}## Start ElasticSearch.
function start_elasticsearch
{### Cannot run elasticsearch as rootsu $ES_USER -c "$ES_HOME/bin/elasticsearch -d"
}## Stop ElasticSearch.
function stop_elasticsearch
{pid=`sudo netstat -nltp | grep -m 1 $ES_PORT | awk '{print $7}' | awk 'BEGIN {FS="/"} {print $1}'`kill $pid
}## Start backend service.
function start_phoebus_olog_service
{cd $BACKEND_DIR/target$JAVA_HOME/bin/java -jar $JAR_PACK > $BACKEND_LOG_DIR/phoebus-olog-service_`date "+%F"`.log &
}## Stop backend service.
function stop_phoebus_olog_service
{pid=`sudo netstat -nltp | grep $BACKEND_PORT | awk '{print $7}' | awk 'BEGIN {FS="/"} {print $1}'`kill $pid
}## Start frontend service.
function start_phoebus_olog_web_client
{deploy_dir=$FRONTEND_DIR/buildbusybox httpd -vv -p $FRONTEND_PORT -h $deploy_dir
}## Stop frontend service.
function stop_phoebus_olog_web_client
{pid=`sudo netstat -nltp | grep $FRONTEND_PORT | awk '{print $7}' | awk 'BEGIN {FS="/"} {print $1}'`kill $pid
}case "$1" instart)start_mongodbstart_elasticsearchstart_phoebus_olog_servicestart_phoebus_olog_web_client;;stop)stop_phoebus_olog_servicestop_phoebus_olog_web_clientstop_mongodbstop_elasticsearch;;
esac
2. 创建systemd服务脚本
创建脚本 /etc/systemd/system/phoebus-olog.service,用于systemd管理:
[Unit]
Description=Phoebus Olog service
After=network.target
Requires=[Service]
ExecStart=/bin/bash -c "/home/dongxw/modules/olog/phoebus-olog-master/phoebus-olog-service.sh start"
ExecStop=/bin/bash -c "/home/dongxw/modules/olog/phoebus-olog-master/phoebus-olog-service.sh stop"
SuccessExitStatus=143
Type=forking[Install]
WantedBy=multi-user.target
3. 启动服务
$ sudo systemctl daemon-reload
$ sudo systemctl start phoebus-olog.service
$ sudo systemctl enable phoebus-olog.service
4. 遇到问题
4.1 ExecStart/ExecStop 不支持复杂bash语法
ExecStart/ExecStop仅支持 【指令 参数 参数 …】的形式,不接受 <、>、>>、|、&等字符,很多bash语法也不接受。
当在phoebus-olog.service脚本中的ExecStart= 和 ExecStop= 使用复杂bash语法时,无法通过systemd的语法校验:
$ sudo systemctl daemon-reload
$ sudo systemctl status -l phoebus-olog.service
· phoebus-olog.service - Phoebus Olog serviceLoaded: error (Reason: Invalid argument)Active: inactive (dead)Dec 23 19:00:07 localhost.localdomain systemd[1]: [/etc/systemd/system/phoebus-olog.service:7] Trailing garbage, ignoring.
Dec 23 19:00:07 localhost.localdomain systemd[1]: [/etc/systemd/system/phoebus-olog.service:8] Trailing garbage, ignoring.
Dec 23 19:00:07 localhost.localdomain systemd[1]: phoebus-olog.service lacks both ExecStart= and ExecStop= setting. Refusing.
systemd: Service lacks both ExecStart= and ExecStop= setting. Refusing
4.2 Java版本导致的systemd启动失败
由于systemd服务以root身份启动,所以自动读取root用户的环境变量。phoebus-olog-service.sh中未指定运行jar包的Java版本时,会优先使用环境变量中搜索到的靠前的Java版本运行,报错如下:
$ sudo systemctl status -l phoebus-olog.service
鈼?phoebus-olog.service - Phoebus Olog serviceLoaded: loaded (/etc/systemd/system/phoebus-olog.service; enabled; vendor preset: disabled)Active: failed (Result: exit-code) since Sun 2022-12-25 21:23:57 CST; 3s agoProcess: 28883 ExecStart=/bin/bash -c /home/dongxw/modules/olog/phoebus-olog-master/phoebus-olog-service.sh start (code=exited, status=0/SUCCESS)Main PID: 28885 (code=exited, status=1/FAILURE)Dec 25 21:23:57 localhost.localdomain bash[28883]: at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
Dec 25 21:23:57 localhost.localdomain bash[28883]: at java.lang.Class.forName0(Native Method)
Dec 25 21:23:57 localhost.localdomain bash[28883]: at java.lang.Class.forName(Class.java:348)
Dec 25 21:23:57 localhost.localdomain bash[28883]: at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:46)
Dec 25 21:23:57 localhost.localdomain bash[28883]: at org.springframework.boot.loader.Launcher.launch(Launcher.java:107)
Dec 25 21:23:57 localhost.localdomain bash[28883]: at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
Dec 25 21:23:57 localhost.localdomain bash[28883]: at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88)
Dec 25 21:23:57 localhost.localdomain systemd[1]: phoebus-olog.service: main process exited, code=exited, status=1/FAILURE
Dec 25 21:23:57 localhost.localdomain systemd[1]: Unit phoebus-olog.service entered failed state.
Dec 25 21:23:57 localhost.localdomain systemd[1]: phoebus-olog.service failed.
发现是Java版本原因。当前jar包以jdk-16.0.2编译,然而通过openjdk 1.8.0_262运行,就会报该错误:
$ whereis java
java: /usr/bin/java /usr/lib/java /etc/java /usr/share/java /home/dongxw/jdk-16.0.2/bin/java /usr/share/man/man1/java.1.gz$ /usr/bin/java -version
openjdk version "1.8.0_262"
OpenJDK Runtime Environment (build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)$ /usr/bin/java -jar ./target/service-olog-2.0.5-SNAPSHOT.jar
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/phoebus/olog/Application has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0at java.lang.ClassLoader.defineClass1(Native Method)at java.lang.ClassLoader.defineClass(ClassLoader.java:756)at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)at java.net.URLClassLoader.access$100(URLClassLoader.java:74)at java.net.URLClassLoader$1.run(URLClassLoader.java:369)at java.net.URLClassLoader$1.run(URLClassLoader.java:363)at java.security.AccessController.doPrivileged(Native Method)at java.net.URLClassLoader.findClass(URLClassLoader.java:362)at java.lang.ClassLoader.loadClass(ClassLoader.java:418)at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151)at java.lang.ClassLoader.loadClass(ClassLoader.java:351)at java.lang.Class.forName0(Native Method)at java.lang.Class.forName(Class.java:348)at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:46)at org.springframework.boot.loader.Launcher.launch(Launcher.java:107)at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88)
4.3 kill -9 导致的systemd退出状态异常(failed)
kill -9导致返回状态status=9/KILL
,systemd显示关闭失败(failed):
$ sudo systemctl stop phoebus-olog.service
$ sudo systemctl status -l phoebus-olog.service
鈼?phoebus-olog.service - Phoebus Olog serviceLoaded: loaded (/etc/systemd/system/phoebus-olog.service; enabled; vendor preset: disabled)Active: failed (Result: signal) since Sun 2022-12-25 21:36:04 CST; 2s agoProcess: 30079 ExecStop=/bin/bash -c /home/dongxw/modules/olog/phoebus-olog-master/phoebus-olog-service.sh stop (code=exited, status=0/SUCCESS)Process: 29927 ExecStart=/bin/bash -c /home/dongxw/modules/olog/phoebus-olog-master/phoebus-olog-service.sh start (code=exited, status=0/SUCCESS)Main PID: 29929 (code=killed, signal=KILL)Dec 25 21:35:23 localhost.localdomain bash[29927]: Dec 25, 2022 9:35:23 PM org.phoebus.olog.Application configureTruststore
Dec 25 21:35:23 localhost.localdomain bash[29927]: INFO: using default javax.net.ssl.trustStore
Dec 25 21:35:23 localhost.localdomain bash[29927]: Dec 25, 2022 9:35:23 PM org.phoebus.olog.Application configureTruststore
Dec 25 21:35:23 localhost.localdomain bash[29927]: INFO: using default javax.net.ssl.trustStorePassword
Dec 25 21:36:04 localhost.localdomain systemd[1]: Stopping Phoebus Olog service...
Dec 25 21:36:04 localhost.localdomain sudo[30093]: root : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/bin/netstat -nltp
Dec 25 21:36:04 localhost.localdomain systemd[1]: phoebus-olog.service: main process exited, code=killed, status=9/KILL
Dec 25 21:36:04 localhost.localdomain systemd[1]: Stopped Phoebus Olog service.
Dec 25 21:36:04 localhost.localdomain systemd[1]: Unit phoebus-olog.service entered failed state.
Dec 25 21:36:04 localhost.localdomain systemd[1]: phoebus-olog.service failed.
kill -9 和 kill -15到底有什么区别呢?该如何选择呢?
4.4 spring-boot:stop失败
Default fork value for spring-boot:stop is not consistent
Spring Boot Maven Plugin
4.5 can not run elasticsearch as root
ElasticSearch不允许使用root用户启动,而systemd以root用户身份运行,因此会报错:
$ vi /home/dongxw/elasticsearch-6.8.4/logs/elasticsearch.log
...
[2022-12-26T16:53:18,615][ERROR][o.e.b.Bootstrap ] [unknown] Exception
java.lang.RuntimeException: can not run elasticsearch as rootat org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:103) ~[elasticsearch-6.8.4.jar:6.8.4]at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:170) ~[elasticsearch-6.8.4.jar:6.8.4]at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:333) [elasticsearch-6.8.4.jar:6.8.4]at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) [elasticsearch-6.8.4.jar:6.8.4]at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) [elasticsearch-6.8.4.jar:6.8.4]at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) [elasticsearch-6.8.4.jar:6.8.4]at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) [elasticsearch-cli-6.8.4.jar:6.8.4]at org.elasticsearch.cli.Command.main(Command.java:90) [elasticsearch-cli-6.8.4.jar:6.8.4]at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:116) [elasticsearch-6.8.4.jar:6.8.4]at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:93) [elasticsearch-6.8.4.jar:6.8.4]
[2022-12-26T16:53:18,622][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [unknown] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as rootat org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:163) ~[elasticsearch-6.8.4.jar:6.8.4]at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) ~[elasticsearch-6.8.4.jar:6.8.4]at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-6.8.4.jar:6.8.4]at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[elasticsearch-cli-6.8.4.jar:6.8.4]at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-6.8.4.jar:6.8.4]at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:116) ~[elasticsearch-6.8.4.jar:6.8.4]at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:93) ~[elasticsearch-6.8.4.jar:6.8.4]
Caused by: java.lang.RuntimeException: can not run elasticsearch as rootat org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:103) ~[elasticsearch-6.8.4.jar:6.8.4]at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:170) ~[elasticsearch-6.8.4.jar:6.8.4]at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:333) ~[elasticsearch-6.8.4.jar:6.8.4]at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) ~[elasticsearch-6.8.4.jar:6.8.4]... 6 more
ES5之后,加"-Des.insecure.allow.root=true"
参数已经不再行得通:
ELASTICSEARCH ROOT身份运行
因此需要在启动ES时,su到非root用户身份。
shell脚本里切换用户执行命令
shell 脚本之切换用户
4.6 su用户无法识别命令参数
报错:
bash: /home/dongxw/elasticsearch-6.8.4/bin/elasticsearch -d: No such file or directory
这是因为su用户的语句中忘了加“-c"
,因此后边想通过su用户执行的语句被当成了单独的一条命令:
su $ES_USER "$ES_HOME/bin/elasticsearch -d"
这里"$ES_HOME/bin/elasticsearch -d"
被当成了单独的命令。
CentOS 7自定义系统服务(以Phoebus-Olog为例)相关推荐
- 在 Android 系统源码中自定义系统服务(Custom System Service in AOSP)
该原创文章首发于微信公众号:字节流动 在 Android 系统源码中自定义系统服务(Custom System Service in AOSP) 配置编译环境(Initial AOSP build e ...
- 零基础创建自定义gym环境——以股票市场为例
零基础创建自定义gym环境--以股票市场为例 翻译自medium上的一篇文章Create custom gym environments from scratch - A stock market e ...
- CentOS 6和CentOS 7管理系统服务的区别
管理系统服务 CentOS 6 CentOS 7 (firewalld.service可简写成firewalld httpd.service可简写成httpd) 关闭防火墙 # service ipt ...
- RHEL/CentOS 6.x 系统服务详解
RHEL/CentOS 6.x的系统服务比5.x系列的要多了很多新面孔,估计很多童鞋不甚理解,网上这方面资料也很少.理解这个对运维人员是必要的,所以花了些时间网上搜集整理了下,供参考,因为开启不必要的 ...
- linux安装高版本r,centos 7 自定义安装最新版R-3.5.0
记录一下R的安装过程,服务器系统版本为centos 7,R版本为最新版3.5.0.下面是安装步骤: wget https://cran.r-project.org/src/base/R-3/R-对应版 ...
- android 8.1 新增自定义系统服务
新增一个自定义的系统服务,并尝试在SystemUI中调用自定义service 一.新建相关文件以及定义服务的注册与启动 1.新建aidl文件 到android8.1/frameworks/base/c ...
- 自学C++之自定义数据类型与自定义类之数组使用4例
2014年05月26日→星座:双子座 二〇一四年四月廿八 甲午[马],己巳月,丁酉日,戊申时 今属:火:五行:木火土金:缺:水. 纳音五行:沙中金. 药王菩萨圣诞纪念日 都是百度知道的答复. 之 ...
- vue 添加全局组件_自定义vue全局组件(Loading为例)
首先创建一个项目 vue init webpack-simple define-demo //define-demo 项目名称 cd define-demo npm install //安装本次所有需 ...
- [Typora Markdown BP] 修改文字格式、图片缩放对齐居中、Excel表格互转、手动分页、表格不分页、Mermaid自定义绘图(以自动机为例)、思维导图导出、word导出删文字、自动编号
目录 文章较长,请点击书签浏览感兴趣的内容. CSDN的渲染与Typora未必一致,下面所有功能都在Typora上测试成功. 文章目录 前言 全局设置 效果类 修改字体.颜色.字体大小.行高等 文字居 ...
最新文章
- 怎么获取html的某个元素,MSHTML怎么获取一个网页元素对象
- 【leetcode】3 minstack
- Hyperledger Fabric 1.0 实战开发系列 第三课 chaincode开发
- 组件Refs(操作DOM的2⃣️两种方法)
- 导出EXCEL遇到问题
- 软件测试—软件测试基础知识—测试用例设计的方法之场景法、正交试验法和错误推断法
- 我是大道至简山寨版~
- linux如何查询一个文件夹大小,Linux下如何查看某个文件夹所占空间大小
- 蓝桥杯 ALGO-113 算法训练 数的统计
- POJ 2117 Electricity 割点 Tarjan算法
- 【驱动安装及keil使用】win10 stm32 stlink驱动安装,检测不到芯片,下载不了程序
- SaaSBase:最适合小团队轻量级项目管理的软件——Tower
- WebRoot目录和WebContent目录的区别
- 快手发布二季度及中期业绩:Q2收入191亿元 同比劲增48.8%
- PDF技术(一)-Java实现Office系列文件转PDF文件
- Mounty解决Mac上午发传输文件到NTFS存储U盘上
- 趣图:你永远想不到用户怎么使用你的产品
- vue3.0移动端 ui_vue.js的移动UI元素
- 文件隐藏服务器版本信息,隐藏Tengine的版本信息
- iOS设备截图和Windows电脑互传,解决提交bug无图不能说明问题
热门文章
- 杂记 什么是NFT?
- 手机管理应用研究【6】——省电管理篇
- 图解HTTP之一--网络基础(TCP/IP、DNS)
- 认识面向对象—车与修车厂
- 2020国际科创节评选揭晓,引力互联获评2020年度人工智能先锋奖!
- html5在线考试倒计时,html5 canvas 实现倒计时 功能
- 改计算机高级设置吃鸡,吃鸡低配置怎么优化 绝地求生大逃杀低配置优化方法...
- 改计算机高级设置吃鸡,《绝地求生大逃杀》笔记本能玩吗?低配置电脑优化教程...
- android项目 用手机,基于Android平台的手机记账应用开发全程实录|Android项目手机记账应用...
- Android2.2获取联系人手机号