ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2021-01-27 22:06:20  阅读:240  来源: 互联网

标签:bin 8.5 tomcat centos 61 systemctl apache my


前言

为了更好的管理自己编写的小程序,可以将自己写的一些小工具直接注册为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查看详细信息
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

标签:bin,8.5,tomcat,centos,61,systemctl,apache,my
来源: https://blog.csdn.net/qq_35824590/article/details/113274681

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有