Linux可以通过Systemd来将应用注册为系统服务。
什么是Systemd?
Systemd是一个系统和服务管理器,用于Linux操作系统,它提供了一种统一的方式来管理系统的进程和服务,Systemd使用服务单元文件(通常是.service文件)来定义服务的行为,包括如何启动、停止、重启服务,以及服务的依赖关系等。
Systemd 的单元文件通常存储在以下目录之一:
/etc/systemd/system/:用于存放系统管理员创建的单元文件,这些文件会覆盖默认的单元文件。
/usr/local/lib/systemd/system/:用于存放用户安装的软件包创建的单元文件。
/lib/systemd/system/:用于存放默认的系统服务单元文件。
除了服务单元,systemd 还支持其他类型的单元文件,它们通常存放在以下目录:
/etc/systemd/system/:可以存放所有类型的单元文件,包括服务、挂载点、设备、套接字等。
/usr/lib/systemd/system/:存放默认的系统单元文件,如 systemd-logind.service。
/lib/systemd/system-generators/:存放系统生成器,这些生成器可以自动创建单元文件。
/lib/systemd/system-preset/:存放预设脚本,这些脚本在系统启动时运行,用于启用或禁用单元文件。
/run/systemd/system/:临时单元文件,这些文件在系统重启后不会保留。
这里拿Caddy来做示例,首先将caddy的可执行文件放在/usr/bin/目录下,配置文件放在/etc/caddy/目录下,创建一个服务单元文件(caddy.service)
touch /lib/systemd/system/caddy.service
然后对caddy.service进行编辑,输入下面内容:
[Unit]
Description=Caddy
Documentation=https://caddyserver.com/docs/
After=network.target network-online.target
Requires=network-online.target
[Service]
Type=notify
User=caddy
Group=caddy
ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile --force
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=512
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_BIND_SERVICE
[Install]
WantedBy=multi-user.target
下面是对每个部分的详细解释,具体支持的配置可以参考官方文档(https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html):
[Unit] 部分
Description=Caddy: 服务的描述,这里指明了是Caddy服务。
Documentation=https://caddyserver.com/docs/: 提供了Caddy官方文档的链接,方便用户查阅更多信息。
After=network.target network-online.target: 指定Caddy服务依赖于网络服务和网络在线服务,这意味着Caddy服务将在这些服务启动后启动。
Requires=network-online.target: 表示Caddy服务需要网络在线服务,如果网络在线服务未启动,Caddy服务将不会启动。
[Service] 部分
Type=notify: 指定服务类型为notify,这意味着systemd会等待服务发送一个通知信号,以确认服务已经准备好。
User=caddy: 指定服务运行的系统用户,这里使用了一个名为"caddy"的用户。
Group=caddy: 指定服务运行的系统组,这里使用了一个名为"caddy"的组。
ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile: 定义了服务启动时执行的命令,这里是Caddy的启动命令,指定了Caddy的可执行文件路径、环境变量的使用、以及配置文件的位置。
ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile --force: 当需要重新加载服务配置时执行的命令,这里使用了--force参数来强制重新加载配置。
TimeoutStopSec=5s: 服务停止时等待的超时时间,这里是5秒。
LimitNOFILE=1048576: 限制服务可以打开的最大文件数,这里是1048576。
LimitNPROC=512: 限制服务可以创建的进程数,这里是512。
PrivateTmp=true: 使得服务的临时文件目录私有化。
ProtectSystem=full: 保护系统文件不被服务修改。
AmbientCapabilities=CAP_NET_BIND_SERVICE: 给予服务绑定低编号端口(如80和443)的能力。
[Install] 部分
WantedBy=multi-user.target: 指定这个服务单元应该被哪些目标单元激活。multi-user.target 表示在系统达到多用户状态时启动这个服务。
创建这个服务单元文件后,你可以使用systemd命令来管理Caddy服务,例如:
systemctl start caddy.service 启动Caddy服务。
systemctl stop caddy.service 停止Caddy服务。
systemctl reload caddy.service 重新加载Caddy配置。
systemctl enable caddy.service 使Caddy服务在系统启动时自动启动。
systemctl disable caddy.service 禁用Caddy服务在系统启动时自动启动。
评论区