关于linux:CentOS-7-使用-systemctl-配置管理服务启停

7次阅读

共计 4720 个字符,预计需要花费 12 分钟才能阅读完成。

我司的服务器根本都是 CentOS 7.x 零碎,通过零碎源装置的服务个别都能够通过 systemctl start XXX.service 命令来一键启动服务,但有一些组件因为种种不可抗因素只能通过解压 tar 包的形式装置到服务器,每次启动都须要到组件目录下执行特定的命令,治理起来非常不不便。能够自行编写 systemctl 配置文件来实现一键启停服务的成果。

操作系统:CentOS 7

systemctl 的配置脚本在服务器的 /usr/lib/systemd 目录下,其中 system 子目录外面的是零碎服务,不依赖用户登录即可运行,user 子目录下的用户服务则须要用户登录前方可运行。
其中 .service 为一般的服务,.target 为开机启动级别的服务。

[root@v130 systemd]# ll /usr/lib/systemd/system
total 1328
-rw-r--r--. 1 root root  275 Apr 27  2018 abrt-ccpp.service
-rw-r--r--. 1 root root  380 Apr 27  2018 abrtd.service
-rw-r--r--. 1 root root  361 Apr 27  2018 abrt-oops.service
-rw-r--r--. 1 root root  266 Apr 27  2018 abrt-pstoreoops.service
-rw-r--r--. 1 root root  262 Apr 27  2018 abrt-vmcore.service
......

[root@v130 systemd]# ll /usr/lib/systemd/user
total 24
-rw-r--r-- 1 root root 131 Nov  3  2018 at-spi-dbus-bus.service
-rw-r--r-- 1 root root 457 Mar 18  2020 basic.target
lrwxrwxrwx 1 root root  26 Apr 13 17:11 bluetooth.target -> ../system/bluetooth.target
-rw-r--r-- 1 root root 414 Mar 18  2020 default.target
-rw-r--r-- 1 root root 499 Mar 18  2020 exit.target
-rw-r--r-- 1 root root 147 Nov  3  2018 glib-pacrunner.service
......

配置文件中蕴含 Unit(服务阐明)、Install(装置配置)、Service(服务外围配置)三大模块。以 mysqld.service 服务为例,其官网配置脚本如下:

#
# systemd service file for MySQL forking server
#

[Unit]
Description=MySQL Server    #服务形容阐明
Documentation=man:mysqld(8)     #文档相干
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target    #服务类别,示意本服务须要在 network 服务启动后在启动
After=syslog.target

[Install]
WantedBy=multi-user.target  #反对多用户

[Service]
User=mysql      #服务运行的用户
Group=mysql     #服务运行的用户组

Type=forking    #后盾运行模式

PIDFile=/var/run/mysqld/mysqld.pid  #寄存 PID 的门路(相对)# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0    #启停服务超时工夫

# Execute pre and post scripts as root
PermissionsStartOnly=true   #是否应用 root 用户执行前置后置命令

# Needed to create system tables
ExecStartPre=/usr/bin/mysqld_pre_systemd    #启动服务前执行的前置命令

# Start main service
#启动服务的命令
ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS   

# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql   #环境配置文件门路
# Sets open_files_limit
LimitNOFILE = 5000

Restart=on-failure  #重启形式,非正常退出时重启
RestartPreventExitStatus=1
PrivateTmp=false

重点介绍次要的配置阐明:

[Service]
Type    后盾运行模式
    simple  默认值,立刻启动,以后过程即为主过程
    forking 服务将以 fork()形式启动,启动后父过程可敞开,子过程作为守护过程运行,倡议个别应用此形式
    oneshot 执行命令结束后即完结
    notify  执行启动结束后发出通知信号,其余服务才持续启动
    dbus    期待 DBus 信号后启动
    idle    期待其余工作执行完后启动
    
ExecStart       服务启动命令
ExecStartPre    服务启动前命令
ExecStartPost   服务启动后命令
ExecReload      服务重启命令
ExecStop        服务进行命令
ExecStopPost    服务进行后命令

PrivateTmp      为服务调配独立的长期空间,True/False
PIDFile         指定寄存过程 PID 的门路,用于追踪过程号
Environment     环境变量,应用形式:Environment=DATA_DIR=/opt/data
EnvironmentFile 指定配置文件

KillMode    进行服务的形式
    control-group   默认值,杀掉以后控制组所有过程
    process         只杀掉主过程
    mixed           发送 sigterm 终止信号给主过程,发送 sigkill 无条件终止信号给子过程
    none            不被动杀任何过程,只执行 ExecStop 命令
Restart     主动重启服务的形式
    no          默认值,退出后不被动重启
    on-success  失常退出(退出状态码为 0)才重启
    on-failure  非正常退出就重启,包含信号终止、超时,守护过程举荐该形式
    on-abnormal 信号终止或超时才重启
    on-abort    没收到信号或信号终止才重启
    on-watchdog 超时才重启
    always      任意退出均会重启
RestartSec  重启后期待的秒数

[Install]
WantedBy
    multi-user.target   多用户命令行状态,举荐设置
    graphical.target    图形界面,依赖于 multi-user.target

[Unit]
Before      指定本服务须要在某服务启动前启动
After       指定启动本服务前需先启动某服务

留神:Exec*** 的命令,仅承受 指令 参数 参数..格局,不能承受 <>|& 等特殊字符,很多 bash 语法也不反对,如果想要反对 bash 语法,须要设置Type=oneshot

以 Consul 为例,创立一个 consul.service 配置:
vi /usr/lib/systemd/system/consul.service

[Unit]
Description=Consul Service
After=network.target
After=syslog.target

[Service]
User=consul
Type=simple
PIDFile=/var/run/consul/consul.pid
TimeoutSec=5
ExecStart=/home/consul agent -server -ui -bootstrap-expect=1 -data-dir=/consuldata -node=v130 -bind=10.0.4.16 -client=0.0.0.0 -dns-port=8640 -http-port=8530 -serf-lan-port=8331 -serf-wan-port=8332 -server-port=8330

Restart=on-failure
PrivateTmp=true

[Install]
WantedBy=multi-user.target

配置结束后,给该配置文件赋予 754 以上权限,并执行 systemctl daemon-reload 刷新系统配置。

[root@v130 ~]# chmod 754 /usr/lib/systemd/system/consul.service
[root@v130 ~]# systemctl daemon-reload
[root@v130 ~]# systemctl start consul

[root@v130 ~]# systemctl status consul
● consul.service - Consul Service
   Loaded: loaded (/usr/lib/systemd/system/consul.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2020-10-08 19:38:19 CST; 31s ago
 Main PID: 20455 (consul)
    Tasks: 22
   Memory: 15.0M
   CGroup: /system.slice/consul.service
           └─20455 /home/consul agent -server -ui -bootstrap-expect=1 -data-dir=/consuldata -node=v130 -bind=10.0.4.16 -client=0.0.0.0 -dns-port=8640...

Oct 08 19:38:28 v130 consul[20455]: 2020/10/08 19:38:28 [INFO] raft: Node at 10.0.4.16:8330 [Leader] entering Leader state
Oct 08 19:38:28 v130 consul[20455]: 2020/10/08 19:38:28 [INFO] consul: cluster leadership acquired
Oct 08 19:38:28 v130 consul[20455]: 2020/10/08 19:38:28 [INFO] consul: New leader elected: v130
Oct 08 19:38:48 v130 consul[20455]: ==> Newer Consul version available: 1.8.4 (currently running: 1.4.3)

如无意外,则可看到 consul 服务曾经稳稳的运行起来了,systemctl status命令可查看服务的状态。

# systemctl status 的参数阐明:Loaded      服务.service 配置文件所在位置
Active      以后运行状态
        loaded          初始化实现
        active(running) 服务失常运行中
        active(exited)  执行过一次命令就完结,目前没有在执行
        active(waiting) 执行中,期待其余事件服务实现
        inactive        服务敞开
        enabled         服务开机自启
        disabled        服务开机不自启
        static          服务开机启动项不可用
        failed          配置谬误
Main PID    主过程 ID
Memory      占用内存大小
CGroup      所有过程详情
正文完
 0