vlambda博客
学习文章列表

将tomcat注册为centos上面的一个systemctl服务


前言
为了更好的管理自己编写的小程序,可以将自己写的一些小工具直接注册为linux服务。下面,我就以tomcat注册为systemctl举例子

下载tomcat
在apack官网下载 tomcat-8.5.61 :https://tomcat.apache.org/download-80.cgi
然后通过xftp放到自己的目标目录

解压tomcat并且编辑

# 因为我下的tomcat是zip压缩的,所以先下一个unzip解压软件yum install unzip# 在目标目录解压unzip apache-tomcat-8.5.61.zip# 赋予权限755# 一般简单赋予权限是755或者777 # 777是所有用户都有执行,读,写权限,755是root用可执行权限.文件所属用户和其它组用户没有执行权限!# 这里考虑到最后会变成服务进行执行,就赋予了755权限chmod 755 -R apache-tomcat-8.5.61/# tomcat开启PID文件cd apache-tomcat-8.5.61/binvi ./catalina.sh


修改 catalina.sh 文件,在 PRGDIR 下面一行添加 CATALINAPID 参数行,如下:

PRGDIR=dirname "$PRG"CATALINA_PID=$PRGDIR/tomcat.pid

然后使用cat命令 修改如下:

cat catalina.sh [root@localhost bin]# cat catalina.sh #!/bin/sh
# Licensed to the Apache Software Foundation (ASF) under one or more# contributor license agreements. See the NOTICE file distributed with# this work for additional information regarding copyright ownership.# The ASF licenses this file to You under the Apache License, Version 2.0# (the "License"); you may not use this file except in compliance with# the License. You may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.

...省略# OS specific support. $var _must_ be set to either true or false....省略

# Get standard environment variablesPRGDIR=`dirname "$PRG"CATALINA_PID=$PRGDIR/tomcat.pid

# Only set CATALINA_HOME if not already set...省略


出现CATALINA_PID=$PRGDIR/tomcat.pid说明修改成功

验证是否开启pid

[root@localhost apache-tomcat-8.5.61]# pwd/home/yky/my-tomcat/apache-tomcat-8.5.61
# 输入启动命令,出现Using CATALINA_PID说明设置成功[root@localhost apache-tomcat-8.5.61]# ./bin/startup.sh Using CATALINA_BASE: /home/yky/my-tomcat/apache-tomcat-8.5.61Using CATALINA_HOME: /home/yky/my-tomcat/apache-tomcat-8.5.61Using CATALINA_TMPDIR: /home/yky/my-tomcat/apache-tomcat-8.5.61/tempUsing JRE_HOME: /usrUsing CLASSPATH: /home/yky/my-tomcat/apache-tomcat-8.5.61/bin/bootstrap.jar:/home/yky/my-tomcat/apache-tomcat-8.5.61/bin/tomcat-juli.jarUsing CATALINA_OPTS: Using CATALINA_PID: /home/yky/my-tomcat/apache-tomcat-8.5.61/bin/tomcat.pidTomcat started.
[root@localhost apache-tomcat-8.5.61]# ll bin/*pid-rw-r-----. 1 root root 5 127 20:16 bin/tomcat.pid

在bin目录下面出现了pid文件,说明设置成功。

开始编写service

# 切换到service目录(deepin的服务)cd /etc/systemd/system# 切换到service目录(centos的服务)cd /usr/lib/systemd/system# vi my-tomcat.service


编写的service

[Unit]# 服务描述Description=my-tomcat # 在那个服务后启动 可以设置多个服务 # 例如After=syslog.target network.target auditd.serviceAfter=syslog.target[Service]# 很重要# 设置进程的启动类型。必须设为 simple, exec, forking, oneshot, dbus, notify, idle 之一# 如果设为 forking ,那么表示 ExecStart= 进程将会在启动过程中使用 fork() 系统调用。# 也就是当所有通信渠道都已建好、启动亦已成功之后,父进程将会退出,而子进程将作为主服务进程继续运行。# 建议同时设置 PIDFile= 选项,以帮助 systemd 准确可靠的定位该服务的主进程。systemd 将会在父进程退出之后 立即开始启动后继单元。Type=forking
# Environment="JAVA_HOME=/usr/local/tools/jdk1.8.0_161"
# PIDFile=/home/yky/my-tomcat/apache-tomcat-8.5.61/bin/tomcat.pid
ExecStart=/home/yky/my-tomcat/apache-tomcat-8.5.61/bin/startup.shExecReload=/bin/kill -s HUP $MAINPIDExecStop=/bin/kill -s QUIT $MAINPID# 不能用来停止 ExecStop=/home/yky/my-tomcat/apache-tomcat-8.5.61/bin/shutdown.shPrivateTmp=trueUser=rootGroup=root[Install]WantedBy=multi-user.target

注册服务

# 新增/修改 service文件后刷新服务systemctl daemon-reload# 启动systemctl start my-tomcat# 停止同理systemctl shop my-tomcat
# 通过systemctl查看服务状态systemctl status my-tomcat.service
my-tomcat.service - my-tomcat Loaded: loaded (/usr/lib/systemd/system/my-tomcat.service; disabled; vendor preset: disabled) Active: active (running) since 三 2021-01-27 21:14:21 CST; 10s ago Process: 2205 ExecStart=/home/yky/my-tomcat/apache-tomcat-8.5.61/bin/startup.sh (code=exited, status=0/SUCCESS) Main PID: 2219 (java) CGroup: /system.slice/my-tomcat.service └─2219 /usr/bin/java -Djava.util.logging.config.file=/home/yky/my-tomcat/apache-tomcat-8.5.61...
1月 27 21:14:21 localhost.localdomain systemd[1]: Starting my-tomcat...1月 27 21:14:21 localhost.localdomain startup.sh[2205]: Tomcat started.1月 27 21:14:21 localhost.localdomain systemd[1]: Started my-tomcat.

通过命令查看是否启动

# 根据端口号查找服务是否存在netstat -nlp|grep :8080tcp6 0 0 :::8080 :::* LISTEN 2219/java
# 根据pid查看详细信息ps -ef | grep 2219root 2219 1 2 21:14 ? 00:00:02 /usr/bin/java -Djava.util.logging.config.file=/home/yky/my-tomcat/apache-tomcat-8.5.61/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /home/yky/my-tomcat/apache-tomcat-8.5.61/bin/bootstrap.jar:/home/yky/my-tomcat/apache-tomcat-8.5.61/bin/tomcat-juli.jar -Dcatalina.base=/home/yky/my-tomcat/apache-tomcat-8.5.61 -Dcatalina.home=/home/yky/my-tomcat/apache-tomcat-8.5.61 -Djava.io.tmpdir=/home/yky/my-tomcat/apache-tomcat-8.5.61/temp org.apache.catalina.startup.Bootstrap startroot      2257  1406  0 21:16 pts/0    00:00:00 grep --color=auto 2219

通过web查看
通过ip:8080的形式访问,出现以下画面说明成功

将tomcat注册为centos上面的一个systemctl服务

画外音:关于服务文件的type=
设置进程的启动类型。必须设为 simple, exec, forking, oneshot, dbus, notify, idle 之一:

因为我只用过simple和forking,所以就简介一下这两种:

如果设为 simple (当设置了 ExecStart= 、 但是没有设置 Type= 与 BusName= 时,这是默认值), 那么 ExecStart= 进程就是该服务的主进程, 并且 systemd 会认为在创建了该服务的主服务进程之后,该服务就已经启动完成。如果此进程需要为系统中的其他进程提供服务, 那么必须在该服务启动之前先建立好通信渠道(例如套接字)。
如果设为 forking ,那么表示 ExecStart= 进程将会在启动过程中使用 fork() 系统调用。也就是当所有通信渠道都已建好、启动亦已成功之后,父进程将会退出,而子进程将作为主服务进程继续运行。这是传统UNIX守护进程的经典做法。在这种情况下,systemd 会认为在父进程退出之后,该服务就已经启动完成。如果使用了此种类型,那么建议同时设置 PIDFile= 选项,以帮助 systemd 准确可靠的定位该服务的主进程。systemd 将会在父进程退出之后 立即开始启动后继单元。
如果想要了解更多,可以查看
systemd.service 中文手册:对于type的讲解特别好

画外音:如何选择服务文件的type=
建议对长时间持续运行的服务尽可能使用 Type=simple (这是最简单和速度最快的选择)。

注意,因为使用任何 simple 之外的类型都需要等待服务完成初始化,所以可能会减慢系统启动速度。因此,应该尽可能避免使用 simple 之外的类型(除非必须)。

对我个人而言,springboot jar等有阻塞信息的我是直接使用的simple,tomcat这种异步不阻塞主线程的我是使用的forking

画外音:关于服务文件PIDfile
该服务PID文件的路径(一般位于 /run/ 目录下)。强烈建议在 Type=forking 的情况下明确设置此选项。如果设为相对路径,那么表示相对于 /run/ 目录。
systemd 将会在此服务启动完成之后,从此文件中读取主服务进程的PID 。systemd 不会写入此文件,但会在此服务停止后删除它(若仍然存在)。
PID文件的拥有者不必是特权用户, 但是如果拥有者是非特权用户,那么必须施加如下安全限制:
(1)不能是一个指向其他拥有者文件的软连接(无论直接还是间接);
(2)其中的PID必须指向一个属于该服务的进程。

关于服务文件编写出错,导致system status一直出错如何处理
systemctl status servicename一直显示失败failed,但是对应service已经重新修改,解决办法是执行 systemctl reset-failed 命令

注意如何处理springboot jar的服务编写
注册springboot 等jar包为服务器上的服务时,最好在jar包的启动路径上编写一个start.sh脚本进行启动,并且在脚本里面进行cd [jar所在路径],这样子,方便使用给予启动路径,springboot启动包才方便读取位于同一路径的 appcalition.yml 等配置文件。并且type需要选择simpl

最后小编送上一点福利


获取更多信息

将tomcat注册为centos上面的一个systemctl服务
将tomcat注册为centos上面的一个systemctl服务

觉得不错你就赞赞我吧!