CentOS 7 使用 systemctl 配置管理服务启停

码农天地 -
CentOS 7 使用 systemctl 配置管理服务启停

我司的服务器基本都是 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      所有进程详情

最后,整理一波关于systemctl的一些常用命令。

start       启动
stop        停止
status      运行状态
restart     重启
reload      重载服务,用于更新配置
enable      设置开机自启动
disable     取消开机自启动
is-enabled  开机自启动状态

daemon-reload             重载systemd,用于新增服务
list-units --type=service 已启动的服务
特别申明:本文内容来源网络,版权归原作者所有,如有侵权请立即与我们联系(cy198701067573@163.com),我们将及时处理。

Tags 标签

加个好友,技术交流

1628738909466805.jpg