centos8之systemd管理服务开机自启动

一、Systemd简介

  systemd即为system daemon,是linux下的一种init软件,由Lennart Poettering带头开发,并在LGPL 2.1及其后续版本许可证下开源发布,开发目标是提供更优秀的框架以表示系统服务间的依赖关系,并依此实现系统初始化时服务的并行启动,同时达到降低Shell的系统开销的效果,最终代替常用的System V与BSD风格init程序。与多数发行版使用的System V风格init相比,systemd采用了以下新技术:

  • (1) 采用Socket激活式与总线激活式服务,以提高相互依赖的各服务的并行运行性能;
  • (2) 用Cgroups代替PID来追踪进程,因此即使是两次fork之后生成的守护进程也不会脱离systemd的控制。

二、配置步骤

  centos8如果像设置服务开机自启动,可以参照centos7方式配置,不过建议使用systemd进行统一管理。此博文示例以配置java程序开机自启动为例进行介绍。

1、编写tomcat服务启停脚本

[root@centos8 tomcat8]# vim autojavaapp.sh
脚本内容如下

#!/bin/bash
#description: 这是tomcat8服务启动、停止、状态查看脚本


APP_NAME="test.jar"

usage() {
    echo "case: sh run.sh [start|stop|restart|status]"
    exit 1
}

isExist(){
  pid=`pgrep -f ${APP_NAME}`
  #如果不存在返回1,存在返回0
  if [ -z "${pid}" ]; then
    return 1
  else
    return 0
  fi    
}

start(){
  isExist
  if [ $? -eq "0" ]; then
    echo "${APP_NAME} is already running,pid = ${pid}."
  else
    cd /opt/javaapp/
    nohup java -jar ${APP_NAME} > /dev/null 2>&1 &
    echo "${APP_NAME} start success"
  fi    
}

stop(){
   isExist
   if [ $? -eq "0" ]; then
     kill -9 ${pid}
   else
     echo "${APP_NAME} is not running"
   fi    
}

status(){
  isExist
   if [ $? -eq "0" ]; then
     echo "${APP_NAME} is running. Pid is ${pid}"
   else
     echo "${APP_NAME} is not running"
   fi  
}

restart(){
  stop
  start
}

case "$1" in
"start")
  start
  ;;
"stop")
  stop
  ;;
"status")
  status
  ;;
"restart")
  restart
  ;;
*)
usage
;;
esac

2、授予脚本可执行权限

[root@centos8 javaapp]# chmod u+x autojavaapp.sh

3、验证脚本启停服务是否正常

[root@centos8 javaapp]# sh autojavaapp.sh status
test.jar is not running
[root@centos8 javaapp]# sh autojavaapp.sh start
test.jar start success
[root@centos8 javaapp]# sh autojavaapp.sh status
test.jar is running. Pid is 18053
[root@centos8 javaapp]# sh autojavaapp.sh stop

4、进入systemd配置文件目录

[root@centos8 javaapp]# cd /usr/lib/systemd/system

5、创建javaapp.service服务

[root@centos8 system]# vim javaapp.service

[root@centos8 system]# pwd
/usr/lib/systemd/system
[root@centos8 system]# cat javaapp.service 
[Unit]
Description=javaapp application for test auto start
Wants=network-online.target
 
[Service]
User=root
Type=forking
ExecStart=/usr/bin/bash /opt/javaapp/autojavaapp.sh start
ExecStop=/usr/bin/bash /opt/javaapp/autojavaapp.sh stop
ExecReload=/usr/bin/bash /opt/javaapp/autojavaapp.sh restart
 
[Install]
WantedBy=multi-user.target 

6、重载systemd配置

[root@centos8 ~]# systemctl daemon-reload

7、配置javaapp服务开机自启动

[root@centos8 system]# systemctl enable javaapp
Created symlink /etc/systemd/system/multi-user.target.wants/javaapp.service → /usr/lib/systemd/system/javaapp.service.

8、启停服务测试

[root@centos8 system]# systemctl status javaapp
centos8之systemd管理服务开机自启动_第1张图片

[root@centos8 system]# systemctl start javaapp
[root@centos8 system]# systemctl status javaapp
centos8之systemd管理服务开机自启动_第2张图片

[root@centos8 system]# systemctl stop javaapp

9、重启验证

centos8之systemd管理服务开机自启动_第3张图片

三、systemd配置文件说明

1、systemd配置文件夹:

systemd 配置文件存在于以下三个文件夹中:

  • /etc/systemd/system 存放系统启动的默认级别及启动的unit的软连接,优先级最高。
  • /run/systemd/system,系统执行过程中产生的服务脚本,优先级次之。
  • /usr/lib/systemd/system 存放系统上所有的启动文件。优先级最低

2、unit分类

unit的定义文件可以根据其后缀名称识别其定义的类型,可以使用systemctl -t help 查看。
.servicre定义了系统服务的启动
.target 定义了系统启动的级别标签,systemd 没有运行级别的概念,创建标签只是为了兼容老版本。
.socket 定义了进程通信用到的套接字,套接字与进程是分离的
.device 定义了系统启动时内核识别的文件,systemd提供了设备的管理功能,/dev 下的设备由/etc/udev/下的配置文件与.device共同定制
.mount 定义了系统的文件系统的挂载点
.snapshop 系统快照
.swap 用于标识swap设备
.automount 文件系统的自动挂载点
.path用于定义文件系统中的一个文件或目录使用。常用于文件系统发生变化时,延迟激活服务。

3、service文件组成:

1、service文件三部分

[Unit]
...
[service]
...
[install]

2)、Unit单元

[Unit] :不属于第二个标签的定义都放在这里,或存放不属于unit类型的定义,描述信息,依赖的unit

  • Description:描述信息
  • After:表明需要依赖的服务,作用决定启动顺序
  • Before:表明被依赖的服务
  • Requles:依赖到的其他unit ,强依赖,即依赖的unit启动失败。该unit不启动。
  • Wants:依赖到的其他unit,弱依赖,即依赖的unit 启动失败。该unit继续启动
  • Conflicts:定义冲突关系

3)、service单元

[Service]:

  • Type:启动时关系的定义,
  • simple:exec启动的进程就是主进程。
  • forking :exec 启动的进程生成的其中一个子进程成为主进程,启动完成后,旧的主进程会退出。
  • ontshot:启动下一个进程前主进程退出。
  • dbus:
  • notify:
  • ldle:
  • PIDFile=/var/run/sshd.pid
  • EnvironmentFile 需要使用到的变量的定义文件
  • ExecStart= 启动 unit需要执行的命令
  • ExecStartpre:
  • ExecStartpost:
  • ExecStop=停止unit需要执行的命令
  • Restart:
  • ExecReload=/bin/kill -HUP $MAINPID
  • KillMode=process
  • Restart=on-failure
  • RestartSec=42s

4)、install单元

[install]:服务启动或禁用时的一些选项

  • Alias:
  • RequlredBy: 被那些unit所依赖,
  • WanteBy:被那些unit所依赖

4、配置重载

修改了的unit文件需要重载,使用如下命令

#systemctl daemon-reload

你可能感兴趣的:(centos8,centos8,systemd,开机自启动,systemctl)