将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/bin
vi ./catalina.sh
修改 catalina.sh 文件,在 PRGDIR 下面一行添加 CATALINAPID 参数行,如下:
PRGDIR=dirname "$PRG"
CATALINA_PID=$PRGDIR/tomcat.pid
然后使用cat命令 修改如下:
cat catalina.sh
[root@localhost bin]# cat catalina.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 variables
PRGDIR=`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]
/home/yky/my-tomcat/apache-tomcat-8.5.61
[root@localhost apache-tomcat-8.5.61]
Using CATALINA_BASE: /home/yky/my-tomcat/apache-tomcat-8.5.61
Using CATALINA_HOME: /home/yky/my-tomcat/apache-tomcat-8.5.61
Using CATALINA_TMPDIR: /home/yky/my-tomcat/apache-tomcat-8.5.61/temp
Using JRE_HOME: /usr
Using 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
Using CATALINA_OPTS:
Using CATALINA_PID: /home/yky/my-tomcat/apache-tomcat-8.5.61/bin/tomcat.pid
Tomcat started.
[root@localhost apache-tomcat-8.5.61]
-rw-r-----. 1 root root 5 1月 27 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.service
After=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.sh
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
# 不能用来停止 ExecStop=/home/yky/my-tomcat/apache-tomcat-8.5.61/bin/shutdown.sh
PrivateTmp=true
User=root
Group=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
/usr/bin/java -Djava.util.logging.config.file=/home/yky/my-tomcat/apache-tomcat-8.5.61...
27 21:14:21 localhost.localdomain systemd[1]: Starting my-tomcat...
27 21:14:21 localhost.localdomain startup.sh[2205]: Tomcat started.
27 21:14:21 localhost.localdomain systemd[1]: Started my-tomcat.
通过命令查看是否启动
# 根据端口号查找服务是否存在
netstat -nlp|grep :8080
tcp6 0 0 :::8080 :::* LISTEN 2219/java
# 根据pid查看详细信息
ps -ef | grep 2219
root 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 start
root 2257 1406 0 21:16 pts/0 00:00:00 grep --color=auto 2219
通过web查看
通过ip:8080的形式访问,出现以下画面说明成功
画外音:关于服务文件的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
最后小编送上一点福利
获取更多信息
觉得不错你就赞赞我吧!