需要开启的服务:
- 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,用于启停相应服务:
MONGODB_HOME=/home/dongxw/mongodb-linux-x86_64-rhel70-5.0.6
ES_HOME=/home/dongxw/elasticsearch-6.8.4
ES_PORT=9200
ES_USER=dongxw
BACKEND_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/logs
FRONTEND_PORT=3000
FRONTEND_DIR=/home/dongxw/modules/olog/phoebus-olog-web-client-1.0.6
function start_mongodb
{
cd $MONGODB_HOME
./bin/mongod --dbpath db --logpath log/mongod.log -fork
}
function stop_mongodb
{
pid=`ps -ef | grep mongod | grep -v grep | awk '{print $2}'`
kill $pid
}
function start_elasticsearch
{
su $ES_USER -c "$ES_HOME/bin/elasticsearch -d"
}
function stop_elasticsearch
{
pid=`sudo netstat -nltp | grep -m 1 $ES_PORT | awk '{print $7}' | awk 'BEGIN {FS="/"} {print $1}'`
kill $pid
}
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 &
}
function stop_phoebus_olog_service
{
pid=`sudo netstat -nltp | grep $BACKEND_PORT | awk '{print $7}' | awk 'BEGIN {FS="/"} {print $1}'`
kill $pid
}
function start_phoebus_olog_web_client
{
deploy_dir=$FRONTEND_DIR/build
busybox httpd -vv -p $FRONTEND_PORT -h $deploy_dir
}
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" in
start)
start_mongodb
start_elasticsearch
start_phoebus_olog_service
start_phoebus_olog_web_client
;;
stop)
stop_phoebus_olog_service
stop_phoebus_olog_web_client
stop_mongodb
stop_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 service
Loaded: 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 service
Loaded: 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 ago
Process: 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.0
at 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 service
Loaded: 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 ago
Process: 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 root
at 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 root
at 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 root
at 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"
被当成了单独的命令。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)