Linux中将程序定义成一个系统服务(自定义Service服务)
2023-12-24 14:26:54
概述
systemctl是一个系统软件服务的管理工具,可以用于启动、停止、重启和重新加载服务,查看服务状态以及设置默认启动级别等。它还可以管理服务之间的依赖关系,定制服务配置,并对服务的日志进行管理
在Linux中,定义软件服务的文件通常是systemd服务单元文件,具有
.service
后缀,这些文件通常位于以下目录:
/etc/systemd/system/
/usr/lib/systemd/system
/lib/systemd/system
Service文件
格式说明
service文件通常由三部分组成:
[Unit]:定义与Unit类型无关的通用选项,用于提供unit的描述信息、unit行为及依赖关系等
[Service]:与特定类型相关的专用选项,此处为Service类型
[Install]:定义由“systemctl enable”以及"systemctl disable“命令在实现服务启用或禁用时用到的一些选项
注意:
以#开头的行后面的内容会被认为是注释
1、yes、on、true代表开启,0、no、off、false代表关闭
时间单位默认是秒,可以用毫秒(ms)分钟(m)等须显式说明
Unit部分
可选项 | 描述 |
---|---|
Description | 对当前服务的简单描述 |
After | 可以指定在哪些服务之后进行启动 |
Before | 可以指定在哪些服务之前进行启动 |
Requires | 可以指定服务依赖于哪些服务(这种依赖是"强依赖",一旦所依赖的服务异常,当前的服务也随之停止) |
Wants | 可以指定服务依赖于哪些服务(这种依赖是"弱依赖",即使所依赖的服务的启动情况不影响当前的服务是否启动) |
Conflicts | 定义units间的冲突关系 |
Service部分
可选项 | 描述 |
---|---|
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的可选值
Type可选项 | 描述 |
---|---|
simple | 指定ExecStart字段的进程为主进程 |
forking | 指定以fork() 子进程执行ExecStart字段的进程 |
oneshot | 执行一次 |
notify | 启动后发送会发送通知信号通知systemd |
idle | 等其他任务结束后才运行 |
Restart的可选值
Restart可选项 | 描述 |
---|---|
no | 退出后不会重启 |
on-success | 当进程正常退出时(退出码为0) 执行重启 |
on-failure | 当进程不正常退出时(退出码不为0) 执行重启 |
on-abnormal | 当被信号终止和超时执行重启 |
on-abort | 当收到没有捕捉到的信号终止时执行重启 |
on-watchdog | 当看门狗超时时执行重启 |
always | 一直重启 |
KillMode可选值
KillMode可选项 | 描述 |
---|---|
control-group | 杀掉当前进程中所有的进程 |
process | 杀掉当前进程的主进程 |
mixed | 主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号 |
none | 不杀掉任何进程 |
Install部分
Install可选项 | 描述 |
---|---|
Alias | 别名,可使用systemctl command Alias.service |
RequiredBy | 被哪些units所依赖,强依赖 |
WantedBy | 被哪些units所依赖,弱依赖 |
Also | 安装本服务的时候还要安装别的相关服务 |
Install | 一般填为WantedBy=multi-user.target |
注意:
对于新创建的unit文件,或者修改了的unit文件,要通知systemd重载此配置文件,而后可以选择重启,使用命令
systemctl daemon-reload
自定义Service服务
这里将一个frpc软件定义成一个服务,通过使用
systemctl
命令进行启动、停止等的管理操作。
创建service文件
新建frpc.service
的service文件,填写以下内容,配置文件信息根据软件(frpc)文件路径更改
[Unit]
Description=Frpc Client Service
After=network.target
[Service]
Type=simple
Restart=always
TimeoutStartSec=30
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/program/frp/frpc -c /usr/local/program/frp/frpc.ini
ExecStop=/bin/kill $MAINPID
ExecReload=/usr/local/program/frp/frpc reload -c /usr/local/program/frp/frpc.ini
[Install]
WantedBy=multi-user.target
启动系统服务
将frpc.service
文件复制到/lib/systemd/system
里面,然后重新加载systemctl配置文件
cp ./frpc.service /lib/systemd/system
systemctl enable frpc
systemctl daemon-reload
启动创建好的服务,并设置自启动
# 重新加载配置文件
systemctl daemon-reload
# 启动frpc服务
systemctl start frpc
# 开机自启动frpc服务
systemctl enable frpc
# 查看frpc当前状态
systemctl status frpc
不出意外,查看软件运行状态,将显示已经正常运行,当用kill -9强制杀死时5s后将会自动重启。
systemctl命令集合
#语法
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
文章来源:https://blog.csdn.net/qq_38628046/article/details/127061029
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!