将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 
#!/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 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]# 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.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]# ll bin/*pid
-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
           └─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 :8080 tcp6 0 0 :::8080 :::* LISTEN 2219/java

根据pid查看详细信息

# 根据端口号查找服务是否存在
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需要选择simple

原文来自码农要飞

钟长森
请先登录后发表评论
  • latest comments
  • 总共0条评论

川公网安备 51010702002018号