我司的服务器根本都是 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 所有过程详情
发表回复