1、阐述
systemd 是一个 系统和服务管理器,用于初始化系统、管理用户空间服务、处理服务依赖关系,并提供强大的日志管理功能
核心特点:
- 并行启动:支持多服务的并行启动,提高启动速度
- 依赖关系管理:自动处理服务之间的依赖关系
- 单一二进制文件:通过 systemctl 管理所有服务、目标、设备等
- 日志系统:通过 journald 提供统一的日志收集和查看功能
- 套接字激活:支持按需启动服务,减少资源浪费
- 服务状态监控:可以自动重启崩溃的服务
2、示例
2.1、创建go应用
package main
import (
"fmt"
"log"
"net/http"
"os"
)
func main() {
instance := os.Getenv("INSTANCE_NAME") // 从环境变量读取实例名
port := os.Getenv("APP_PORT") // 从环境变量读取端口
if port == "" {
port = "8080" // 默认端口
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello from instance %s running on port %s\n", instance, port)
log.Printf("Instance %s handled a request\n", instance)
})
log.Printf("Instance %s starting on port %s\n", instance, port)
log.Fatal(http.ListenAndServe(":"+port, nil))
}
2.2、编译应用
cd /opt/myapp
go build -o myapp main.go
2.3、创建 systemd 服务模板
在 /etc/systemd/system/ 下创建一个 systemd 服务模板文件 : myapp.service
[root@66c6012ecfd1 system]# cat myapp.service
[Unit]
Description=MyApp Go Service Instance my-web
After=network.target
[Service]
Type=simple
EnvironmentFile=/etc/myapp.env
ExecStart=/opt/myapp/myapp
Restart=always
User=nobody
Group=nogroup
[Install]
WantedBy=multi-user.target
说明 :
- EnvironmentFile:指定每个实例的环境变量配置文件
- ExecStart:启动 Go 应用的路径
- Restart=always:服务异常退出时自动重启
- User 和 Group:指定运行服务的用户和组
2.4、创建实例环境文件
/etc/myapp.env
[root@66c6012ecfd1 system]# cat /etc/myapp.env
INSTANCE_NAME=my-web
APP_PORT=8081
2.5、操作
启动
systemctl start myapp.service
停止
systemctl stop myapp.service
开机启动
systemctl enable myapp.service
查看服务日志
journalctl -u myapp.service
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。