我司的服务器根本都是 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/systemtotal 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/usertotal 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.targetlrwxrwxrwx 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.htmlAfter=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 rootPermissionsStartOnly=true   #是否应用root用户执行前置后置命令# Needed to create system tablesExecStartPre=/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 implementationEnvironmentFile=-/etc/sysconfig/mysql   #环境配置文件门路# Sets open_files_limitLimitNOFILE = 5000Restart=on-failure  #重启形式,非正常退出时重启RestartPreventExitStatus=1PrivateTmp=false

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

[Service]Type    后盾运行模式    simple  默认值,立刻启动,以后过程即为主过程    forking 服务将以fork()形式启动,启动后父过程可敞开,子过程作为守护过程运行,倡议个别应用此形式    oneshot 执行命令结束后即完结    notify  执行启动结束后发出通知信号,其余服务才持续启动    dbus    期待DBus信号后启动    idle    期待其余工作执行完后启动    ExecStart       服务启动命令ExecStartPre    服务启动前命令ExecStartPost   服务启动后命令ExecReload      服务重启命令ExecStop        服务进行命令ExecStopPost    服务进行后命令PrivateTmp      为服务调配独立的长期空间,True/FalsePIDFile         指定寄存过程PID的门路,用于追踪过程号Environment     环境变量,应用形式:Environment=DATA_DIR=/opt/dataEnvironmentFile 指定配置文件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 ServiceAfter=network.targetAfter=syslog.target[Service]User=consulType=simplePIDFile=/var/run/consul/consul.pidTimeoutSec=5ExecStart=/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=8330Restart=on-failurePrivateTmp=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 stateOct 08 19:38:28 v130 consul[20455]: 2020/10/08 19:38:28 [INFO] consul: cluster leadership acquiredOct 08 19:38:28 v130 consul[20455]: 2020/10/08 19:38:28 [INFO] consul: New leader elected: v130Oct 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    主过程IDMemory      占用内存大小CGroup      所有过程详情