Systemd 是一个现代软件套件,它在 Linux 系统上提供多种组件,包括系统和服务管理器。它与 SysV 和 LSB 初始化脚本兼容,并可作为 sysvinit 的替代品。
Systemd 服务在单元文件中定义(此处的单元表示服务和系统资源,例如设备、套接字、挂载点等)。自定义服务单元文件应存储在 /usr/lib/systemd/system/ 目录中,并且以”.service”作为文件扩展名。例如,自定义的 test-app 服务会使用 /usr/lib/systemd/system/test-app.service 单元文件。
单元文件是纯文本 ini 样式文件,通常包含三个公共部分。第一部分通常是单元部分(Unit),它携带有关单元的通用信息,该信息不依赖于单元的类型;第二部分是单位类型部分,对于服务来说,它是Service部分;最后一部分是安装部分(Install),其中包含设备的安装信息。
在本教程中,将展示如何在 Linux 中创建新的 systemd 服务并使用 systemctl 命令管理该服务。
1] 创建自定义 Systemd 文件
要将应用程序或程序脚本作为 systemd 下的服务运行,可以按如下方式创建新的 systemd 服务。
首先在 /etc/systemd/system/ 目录下创建一个名为 test-app.service 的服务单元文件(需要注意的是,此时会将 test-app 替换为服务或应用程序的实际名称):
# vi /usr/lib/systemd/system/test-app.service
以下是一个用于启动 godoc WEB页面的服务:
[Unit] Description=The Godoc HTTP server After=syslog.target network.target remote-fs.target nss-lookup.target [Service] User=root Group=root WorkingDirectory=/usr/local/go/bin/ Environment="PATH=/usr/local/go/bin/godoc" ExecStart=/usr/local/go/bin/godoc -play -http=127.0.0.1:65000 ExecReload=/bin/kill -s HUP $MAINPID [Install] WantedBy=multi-user.target
我们对以上指令作简单说明:
- Description:是服务是简要说明,会在启动服务时提示启动了服务描述
- After:定义服务的启动关系,本例中,服务会在 syslog、network 等服务完成后才会被激活
- User:定义启动服务时所使用的用户
- Group:定义启动服务时所使用的属组
- WorkingDirectory:定义可执行进程的工作目录
- Environment:为工作进程设置对应的环境变量
- ExecStart:定义服务启动时执行的命令及对应的参数
- ExecReload:用于定义要执行的命令以触发服务中的配置重新加载
- WantedBy:当使用 systemctl enable 启用 test-app.service 单元时,可以在每个列出的单元(在本例中为 multi-user.target)的 .wants/ 或 .requires/ 目录中创建符号链接 命令
对于其他单元文件参数的设置,可以参考 >>官方文档<< 进行深入了解。
将单元文件保存后,可以执行如下命令使新创建的 Systemd 服务生效:
#systemctl daemon-reload command
2] Linux 系统管理 Systemd 服务
启动和查看服务状态可以使用如下命令:
# systemctl start test-app.service # systemctl status test-app.service
图.1 启动和查看 systemd 服务状态
停止或重新启动服务,使用如下命令:
# systemctl stop test-app.service # systemctl restart test-app.service
如果想要将服务设置为开机自动启动或停止开机自动启动,使用如下命令即可:
# systemctl enable test-app.service # systemctl is-enabled test-app.service # systemctl disable test-app.service
图.2 添加或删除开机服务自动启动
需要了解更多有关于管理 systemd 服务的细节,可以使用如下命令了解详细信息:
# man systemctl