需要开启的服务:

  1. MongoDB
  2. ElasticSearch
  3. Phoebus-Olog后端服务
  4. 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为例)相关推荐

  1. 在 Android 系统源码中自定义系统服务(Custom System Service in AOSP)

    该原创文章首发于微信公众号:字节流动 在 Android 系统源码中自定义系统服务(Custom System Service in AOSP) 配置编译环境(Initial AOSP build e ...

  2. 零基础创建自定义gym环境——以股票市场为例

    零基础创建自定义gym环境--以股票市场为例 翻译自medium上的一篇文章Create custom gym environments from scratch - A stock market e ...

  3. CentOS 6和CentOS 7管理系统服务的区别

    管理系统服务 CentOS 6 CentOS 7 (firewalld.service可简写成firewalld httpd.service可简写成httpd) 关闭防火墙 # service ipt ...

  4. RHEL/CentOS 6.x 系统服务详解

    RHEL/CentOS 6.x的系统服务比5.x系列的要多了很多新面孔,估计很多童鞋不甚理解,网上这方面资料也很少.理解这个对运维人员是必要的,所以花了些时间网上搜集整理了下,供参考,因为开启不必要的 ...

  5. 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-对应版 ...

  6. android 8.1 新增自定义系统服务

    新增一个自定义的系统服务,并尝试在SystemUI中调用自定义service 一.新建相关文件以及定义服务的注册与启动 1.新建aidl文件 到android8.1/frameworks/base/c ...

  7. 自学C++之自定义数据类型与自定义类之数组使用4例

     2014年05月26日→星座:双子座 二〇一四年四月廿八 甲午[马],己巳月,丁酉日,戊申时 今属:火:五行:木火土金:缺:水. 纳音五行:沙中金. 药王菩萨圣诞纪念日 都是百度知道的答复. 之 ...

  8. vue 添加全局组件_自定义vue全局组件(Loading为例)

    首先创建一个项目 vue init webpack-simple define-demo //define-demo 项目名称 cd define-demo npm install //安装本次所有需 ...

  9. [Typora Markdown BP] 修改文字格式、图片缩放对齐居中、Excel表格互转、手动分页、表格不分页、Mermaid自定义绘图(以自动机为例)、思维导图导出、word导出删文字、自动编号

    目录 文章较长,请点击书签浏览感兴趣的内容. CSDN的渲染与Typora未必一致,下面所有功能都在Typora上测试成功. 文章目录 前言 全局设置 效果类 修改字体.颜色.字体大小.行高等 文字居 ...

最新文章

  1. 怎么获取html的某个元素,MSHTML怎么获取一个网页元素对象
  2. 【leetcode】3 minstack
  3. Hyperledger Fabric 1.0 实战开发系列 第三课 chaincode开发
  4. 组件Refs(操作DOM的2⃣️两种方法)
  5. 导出EXCEL遇到问题
  6. 软件测试—软件测试基础知识—测试用例设计的方法之场景法、正交试验法和错误推断法
  7. 我是大道至简山寨版~
  8. linux如何查询一个文件夹大小,Linux下如何查看某个文件夹所占空间大小
  9. 蓝桥杯 ALGO-113 算法训练 数的统计
  10. POJ 2117 Electricity 割点 Tarjan算法
  11. 【驱动安装及keil使用】win10 stm32 stlink驱动安装,检测不到芯片,下载不了程序
  12. SaaSBase:最适合小团队轻量级项目管理的软件——Tower
  13. WebRoot目录和WebContent目录的区别
  14. 快手发布二季度及中期业绩:Q2收入191亿元 同比劲增48.8%
  15. PDF技术(一)-Java实现Office系列文件转PDF文件
  16. Mounty解决Mac上午发传输文件到NTFS存储U盘上
  17. 趣图:你永远想不到用户怎么使用你的产品
  18. vue3.0移动端 ui_vue.js的移动UI元素
  19. 文件隐藏服务器版本信息,隐藏Tengine的版本信息
  20. iOS设备截图和Windows电脑互传,解决提交bug无图不能说明问题

热门文章

  1. 杂记 什么是NFT?
  2. 手机管理应用研究【6】——省电管理篇
  3. 图解HTTP之一--网络基础(TCP/IP、DNS)
  4. 认识面向对象—车与修车厂
  5. 2020国际科创节评选揭晓,引力互联获评2020年度人工智能先锋奖!
  6. html5在线考试倒计时,html5 canvas 实现倒计时 功能
  7. 改计算机高级设置吃鸡,吃鸡低配置怎么优化 绝地求生大逃杀低配置优化方法...
  8. 改计算机高级设置吃鸡,《绝地求生大逃杀》笔记本能玩吗?低配置电脑优化教程...
  9. android项目 用手机,基于Android平台的手机记账应用开发全程实录|Android项目手机记账应用...
  10. Android2.2获取联系人手机号