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