共计 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 所有过程详情
正文完