在Linux系统中将自己部署的服务注册为系统服务
一、概述
systemctl是一个系统软件服务的管理工具,可以用于启动、停止、重启和重新加载服务,查看服务状态以及设置默认启动级别等。它还可以管理服务之间的依赖关系,定制服务配置,并对服务的日志进行管理,在Linux中,定义软件服务的文件通常是systemd服务单元文件,具有.service后缀,这些文件通常位于以下目录:
XML/HTML代码
- /etc/systemd/system/
- /usr/lib/systemd/system
- /lib/systemd/system
二、service文件
1、格式说明
service文件通常由三部分组成:
XML/HTML代码
- [Unit]:定义与Unit类型无关的通用选项,用于提供unit的描述信息、unit行为及依赖关系等
- [Service]:与特定类型相关的专用选项,此处为Service类型
- [Install]:定义由“systemctl enable”以及"systemctl disable“命令在实现服务启用或禁用时用到的一些选项
注:以#开头的行后面的内容会被认为是注释
1、yes、on、true代表开启,0、no、off、false代表关闭
时间单位默认是秒,可以用毫秒(ms)分钟(m)等须显式说明
2、可选项说明
Unit部分
XML/HTML代码
- Description: 对当前服务的简单描述
- After: 可以指定在哪些服务之后进行启动
- Before: 可以指定在哪些服务之前进行启动
- Requires: 可以指定服务依赖于哪些服务(这种依赖是"强依赖",一旦所依赖的服务异常,当前的服务也随之停止)
- Wants: 可以指定服务依赖于哪些服务(这种依赖是"弱依赖",即使所依赖的服务的启动情况不影响当前的服务是否启动)
- Conflicts: 定义units间的冲突关系
Service部分
XML/HTML代码
- EnvironmentFile: 环境配置文件,用来指定当前服务启动的环境变量
- ExecStart: 指定服务启动时执行的命令或脚本
- ExecStartPre: 指定服务启动前执行的命令或脚本
- ExecStartPost: 指定服务启动后执行的命令或脚本
- ExecStop: 指明停止服务要运行的命令或脚本
- ExecStopPost: 指定服务停止之后执行的命令或脚本
- RestartSec: 指定服务在重启时等待的时间,单位为秒
- ExecReload: 指明重启服务要运行的命令或脚本
- Restart: 当设定Restart=1 时,则当次daemon服务意外终止后,会再次自动启动此服务,具体看下列类型
- PrivateTmp: 设定为yes时,会在生成/tmp/systemd-private-UUID-NAME.service-XXXXX/tmp/目录
- KillMode: 指定停止的方式,具体见下面
- Restart: 指定重启时的类型,具体见下面
- Type: 指定启动类型,具体见下面
type的可选值
XML/HTML代码
- simple 指定ExecStart字段的进程为主进程
- forking 指定以fork() 子进程执行ExecStart字段的进程
- oneshot 执行一次
- notify 启动后发送会发送通知信号通知systemd
- idle 等其他任务结束后才运行
Restart的可选值
XML/HTML代码
- no: 退出后不会重启
- on-success: 当进程正常退出时(退出码为0) 执行重启
- on-failure: 当进程不正常退出时(退出码不为0) 执行重启
- on-abnormal: 当被信号终止和超时执行重启
- on-abort: 当收到没有捕捉到的信号终止时执行重启
- on-watchdog: 当看门狗超时时执行重启
- always: 一直重启
KillMode可选值
XML/HTML代码
- control-group: 杀掉当前进程中所有的进程
- process: 杀掉当前进程的主进程
- mixed: 主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
- none: 不杀掉任何进程
Install部分
XML/HTML代码
- Alias: 别名,可使用systemctl command Alias.service
- RequiredBy: 被哪些units所依赖,强依赖
- WantedBy: 被哪些units所依赖,弱依赖
- Also: 安装本服务的时候还要安装别的相关服务
- Install: 一般填为WantedBy=multi-user.target
三、service文件样例
将自己部署的nginx注册为系统服务
XML/HTML代码
- [Unit]
- Description=The nginx web and reverse proxy server
- Documentation=https://nginx.org/en/docs/
- After=network-online.target remote-fs.target nss-lookup.target
- Wants=network-online.target
- [Service]
- Type=forking
- #启动检测命令
- ExecStartPre=/usr/local/nginx/sbin/nginx -t
- #启动命令
- ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
- #重载配置文件命令
- ExecReload=/usr/local/nginx/sbin/nginx -s reload
- #停止命令
- ExecStop=/usr/local/nginx/sbin/nginx -s quit
- [Install]
- WantedBy=multi-user.target
将自己部署的mysql注册为系统服务
XML/HTML代码
- [Unit]
- Description=Mysql
- After=syslog.target network.target remote-fs.target nss-lookup.target
- [Service]
- Type=forking
- #指定PID文件
- PIDFile=/usr/local/mysql/data/centos-linux.shared.pid
- #启动MySQL
- ExecStart=/usr/local/mysql/support-files/mysql.server start
- #重载
- ExecReload=/bin/kill -s HUP $MAINPID
- #停止服务
- ExecStop=/usr/local/mysql/support-files/mysql.server stop
- PrivateTmp=false
- [Install]
- WantedBy=multi-user.target
四、systemctl命令合集
XML/HTML代码
- #语法
- systemctl COMMAND name.service
- #启动
- systemctl start name.service
- #停止
- systemctl stop name.service
- #重启
- systemctl restart name.service
- #查看状态
- systemctl status name.service
- #禁止自动和手动启动
- systemctl mask name.service
- #取消禁止
- systemctl unmask name.service
- #查看某服务当前激活与否的状态
- systemctl is-active name.service
- #查看所有已经激活的服务
- systemctl list-units --type|-t service
- #查看所有服务
- systemctl list-units --type service --all
- #设定某服务开机自启,相当于chkconfig name on
- systemctl enable name.service
- #设定某服务开机禁止启动:相当于chkconfig name off
- systemctl disable name.service
- #查看所有服务的开机自启状态,相当于chkconfig --list
- systemctl list-unit-files --type service
- #用来列出该服务在哪些运行级别下启用和禁用:chkconfig –list name
- ls /etc/systemd/system/*.wants/name.service
- #查看服务是否开机自启
- systemctl is-enabled name.service
- #列出失败的服务
- systemctl --failed --type=service
- #开机并立即启动或停止
- systemctl enable --now postfix
- systemctl disable --now postfix
- #查看服务的依赖关系
- systemctl list-dependencies name.service
- #杀掉进程
- systemctl kill unitname
- #重新加载配置文件
- systemctl daemon-reload
- #关机
- systemctl halt、systemctl poweroff
- #重启
- systemctl reboot
- #挂起
- systemctl suspend
- #休眠
- systemctl hibernate
- #休眠并挂起
- systemctl hybrid-sleep