我司的服务器基本都是 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 已启动的服务
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。