CentOS7利用systemctl添加自定义系统服务
Unit段:
Description:描述这个 Unit 文件的信息
Documentation:指定服务的文档,可以是一个或多个文档的 URL 路径
Requires:依赖的其它 Unit 列表,列在其中的 Unit 模板会在这个服务启动时的同时被启动。并且,如果其中任意一个服务启动失败,这个服务也会被终止
Wants:与 Requires 相似,但只是在被配置的这个 Unit 启动时,触发启动列出的每个 Unit 模块,而不去考虑这些模板启动是否成功
After:与 Requires 相似,但是在后面列出的所有模块全部启动完成以后,才会启动当前的服务
Before:与 After 相反,在启动指定的任务一个模块之间,都会首先确证当前服务已经运行
Binds To:与 Requires 相似,失败时失败,成功时成功,但是在这些模板中有任意一个出现意外结束或重启时,这个服务也会跟着终止或重启
Part Of:一个 Bind To 作用的子集,仅在列出的任务模块失败或重启时,终止或重启当前服务,而不会随列出模板的启动而启动
OnFailure:当这个模板启动失败时,就会自动启动列出的每个模块
Conflicts:与这个模块有冲突的模块,如果列出的模块中有已经在运行的,这个服务就不能启动,反之亦然
Install段:
这部分配置的目标模块通常是特定运行目标的 .target 文件,用来使得服务在系统启动时自动运行。这个区段可以包含三种启动约束
WantedBy:和 Unit 段的 Wants 作用相似,只有后面列出的不是服务所依赖的模块,而是依赖当前服务的模块。它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入 /etc/systemd/system 目录下面以 <Target 名> + .wants 后缀构成的子目录中,如 “/etc/systemd/system/multi-user.target.wants/“ # find /etc/systemd/system/* -type d /etc/systemd/system/default.target.wants /etc/systemd/system/getty.target.wants /etc/systemd/system/graphical.target.wants /etc/systemd/system/multi-user.target.wants /etc/systemd/system/network-online.target.wants /etc/systemd/system/paths.target.wants /etc/systemd/system/shutdown.target.wants /etc/systemd/system/sockets.target.wants /etc/systemd/system/sysinit.target.wants /etc/systemd/system/timers.target.wants RequiredBy:和 Unit 段的 Wants 作用相似,只有后面列出的不是服务所依赖的模块,而是依赖当前服务的模块。它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入 /etc/systemd/system 目录下面以 <Target 名> + .required 后缀构成的子目录中 Also:当前 Unit enable/disable 时,同时 enable/disable 的其他 Unit Alias:当前 Unit 可用于启动的别名,通过 systemctl list-units --type=target 命令可以获取当前正在使用的运行目标
Service段:
用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段分为服务生命周期和服务上下文配置两个方面
1、服务生命周期控制相关
Type:定义启动时的进程行为,它有以下几种值: Type=simple:默认值,执行ExecStart指定的命令,启动主进程 Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出 Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行 Type=dbus:当前服务通过D-Bus启动 Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行 Type=idle:若有其他任务执行完毕,当前服务才会运行 RemainAfterExit:值为 true 或 false(默认)。当配置为 true 时,Systemd 只会负责启动服务进程,之后即便服务进程退出了,Systemd 也仍然会认为这个服务还在运行中。这个配置主要是提供给一些并非常驻内存,而是启动注册后立即退出,然后等待消息按需启动的特殊类型服务使用的。 ExecStart:启动当前服务的命令 ExecStartPre:启动当前服务之前执行的命令 ExecStartPos:启动当前服务之后执行的命令 ExecReload:重启当前服务时执行的命令 ExecStop:停止当前服务时执行的命令 ExecStopPost:停止当其服务之后执行的命令 RestartSec:自动重启当前服务间隔的秒数 Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括 always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog TimeoutStartSec:启动服务时等待的秒数,这一配置对于使用 Docker 容器而言显得尤为重要,因其第一次运行时可能需要下载镜像,严重延时会容易被 Systemd 误判为启动失败杀死。通常,对于这种服务,将此值指定为 0,从而关闭超时检测 TimeoutStopSec:停止服务时的等待秒数,如果超过这个时间仍然没有停止,Systemd 会使用 SIGKILL 信号强行杀死服务的进程
2、服务上下文配置相关
Environment:为服务指定环境变量 EnvironmentFile:指定加载一个包含服务所需的环境变量的列表的文件,文件中的每一行都是一个环境变量的定义 Nice:服务的进程优先级,值越小优先级越高,默认为 0。其中 -20 为最高优先级,19 为最低优先级 WorkingDirectory:指定服务的工作目录 RootDirectory:指定服务进程的根目录(/ 目录)。如果配置了这个参数,服务将无法访问指定目录以外的任何文件 User:指定运行服务的用户 Group:指定运行服务的用户组 MountFlags:服务的 Mount Namespace 配置,会影响进程上下文中挂载点的信息,即服务是否会继承主机上已有挂载点,以及如果服务运行执行了挂载或卸载设备的操作,是否会真实地在主机上产生效果。可选值为 shared、slaved 或 private shared:服务与主机共用一个 Mount Namespace,继承主机挂载点,且服务挂载或卸载设备会真实地反映到主机上 slave:服务使用独立的 Mount Namespace,它会继承主机挂载点,但服务对挂载点的操作只有在自己的 Namespace 内生效,不会反映到主机上 private:服务使用独立的 Mount Namespace,它在启动时没有任何任何挂载点,服务对挂载点的操作也不会反映到主机上 LimitCPU / LimitSTACK / LimitNOFILE / LimitNPROC 等:限制特定服务的系统资源量,例如 CPU、程序堆栈、文件句柄数量、子进程数量等
参考文档:https://mp.weixin.qq.com/s?__biz=MzI3MTI2NzkxMA==&mid=2247488752&idx=1&sn=8cef2220e760b5871230ef993a4a0a0b&chksm=eac535d9ddb2bccf8acf7b0ed50c4bc6d10dd8423c5fd9caca5c895d525704c48c77c8cc506c&mpshare=1&scene=1&srcid=&sharer_sharetime=1569643882536&sharer_shareid=d6292ce98f9df751d9a82b349de44853#rd
参考文档:https://www.freedesktop.org/software/systemd/man/systemd.service.html
Restart
字段可以设置的值如下。
no(默认值):退出后不会重启 on-success:只有正常退出时(退出状态码为0),才会重启 on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启 on-abnormal:只有被信号终止和超时,才会重启 on-abort:只有在收到没有捕捉到的信号终止时,才会重启 on-watchdog:超时退出,才会重启 always:不管是什么退出原因,总是重启
对于守护进程,推荐设为on-failure。对于那些允许发生错误退出的服务,可以设为on-abnormal
RestartSec字段:表示 Systemd 重启服务之前,需要等待的秒数
Systemd 默认从目录/etc/systemd/system/读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录/usr/lib/systemd/system/或/lib/systemd/system/,真正的配置文件存放在那个目录。systemctl enable命令用于在上面两个目录之间,建立符号链接关系。
所有可用的单元文件存放在 /usr/lib/systemd/system/ 和 /etc/systemd/system/ 目录(后者优先级更高)
如果创建单位用的系统配置文件位于 /lib/systemd/system/,则 /etc/systemd/system 目录下的同名文件会优先于前者。
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
CentOS7的服务systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和用户(user)之分,需要开机不登陆就能运行的程序,存在系统服务里,即:/usr/lib/systemd/system目录下.
CentOS7的每一个服务以.service结尾,一般会分为3部分:[Unit]、[Service]和[Install]
[Unit]部分主要是对这个服务的说明,内容包括Description和After,Description 用于描述服务,After用于描述服务类别
[Service]部分是服务的关键,是服务的一些具体运行参数的设置. Type=forking是后台运行的形式, User=users是设置服务运行的用户, Group=users是设置服务运行的用户组, PIDFile为存放PID的文件路径, ExecStart为服务的具体运行命令, ExecReload为重启命令, ExecStop为停止命令, PrivateTmp=True表示给服务分配独立的临时空间 注意:[Service]部分的启动、重启、停止命令全部要求使用绝对路径,使用相对路径则会报错!
[Install]部分是服务安装的相关设置,可设置为多用户的
首先,使用systemctl start [ 服务名(也是文件名) ] 可测试服务是否可以成功运行,如果不能运行则可以使用systemctl status [ 服务名(也是文件名) ]查看错误信息和其他服务信息,然后根据报错进行修改,直到可以start,如果不放心还可以测试restart和stop命令。
接着,只要使用systemctl enable xxxxx就可以将所编写的服务添加至开机启动即可。
实例:服务用于开机运行tomcat项目:
vim /usr/lib/systemd/system/tomcat.service [Unit] Description=java tomcat project After=tomcat.service [Service] Type=forking User=users Group=users PIDFile=/usr/local/tomcat/tomcat.pid ExecStart=/usr/local/tomcat/bin/startup.sh ExecReload= ExecStop=/usr/local/tomcat/bin/shutdown.sh PrivateTmp=true [Install] WantedBy=multi-user.target
添加可执行权限:
chmod 755 /usr/lib/systemd/system/tomcat.service
设置为开机自启动:
#systemctl enable tomcat.service
常用指令(以tomcat服务为例):
启动某服务 systemctl start tomcat.service 停止某服务 systemctl stop tomcat.service 重启某服务 service tomcat restart systemctl restart tomcat.service 使某服务自动启动(如tomcat服务) systemctl enable tomcat.service 使某服务不自动启动 systemctl disable tomcat.service 检查服务状态 systemctl status tomcat.service (服务详细信息) systemctl is-active tomcat.service(仅显示是否Active) 显示所有已启动的服务 systemctl list-units --type=service