golang跨平台*nix系统进程守护与管理插件库immortal的使用
Golang跨平台*nix系统进程守护与管理插件库immortal的使用
概述
immortal是一个*nix跨平台(操作系统无关)的进程守护工具,可以帮助您管理和守护系统进程。
安装方法
从源码编译安装
- 设置Go环境(需要Go >= 1.12)
$ export GOPATH=$HOME/go
- 创建目录并克隆项目
$ mkdir -p $HOME/go/src/github.com/immortal
$ git clone git@github.com:immortal/immortal.git $HOME/go/src/github.com/immortal/immortal
- 编译和安装
$ cd $HOME/go/src/github.com/immortal/immortal
$ make
$ make install
注意事项
如果服务需要以非root用户(如www、nobody、www-data)身份运行,必须从源码编译安装,否则可能会遇到错误:
Error looking up user: "www". user: Lookup requires cgo
配置示例
基本配置示例
/usr/local/etc/immortal/www.yml
文件内容示例:
# pkg install go-www
cmd: www
cwd: /usr/ports
log:
file: /var/log/www.log
age: 10 # seconds
num: 7 # int
size: 1 # MegaBytes
wait: 1
require:
- foo
- bar
说明:
cmd
: 要运行的命令cwd
: 工作目录log
: 日志配置file
: 日志文件路径age
: 日志轮转时间(秒)num
: 保留的日志文件数量size
: 日志文件大小限制(MB)
wait
: 等待时间require
: 依赖的服务(需要先启动的服务)
如果foo
和bar
没有运行,www
服务将不会启动。可以省略age
、num
和size
选项来完全禁用日志轮转。
目录结构
使用immortaldir时的结构
/usr/local/etc/immortal
|--foo.yml
|--bar.yml
`--www.yml
运行时目录结构
/var/run/immortal
|--foo
| |-lock
| `-immortal.sock
|--bar
| |-lock
| `-immortal.sock
`--www
|-lock
`-immortal.sock
非root用户运行时的结构
~/.immortal
|--(pid)
| |--lock
| `--immortal.sock
|--(pid)
| |--lock
| `--immortal.sock
`--(pid)
|--lock
`--immortal.sock
可以使用-name
参数指定服务名称代替pid:
immortal -ctl myservice sleep 1000
将创建:
~/.immortal
|--myservice
| |--lock
| `--immortal.sock
管理工具
immortalctl
用于查看当前状态和管理服务。
调试命令
pgrep -fl "immortal -ctl" | awk '{print $1}' | xargs watch -n .1 pstree -p
使用curl和jq测试状态
查看状态
curl --unix-socket immortal.sock http:/status -s | jq
停止服务
curl --unix-socket immortal.sock http://im/signal/d -s | jq
启动服务
curl --unix-socket immortal.sock http://im/signal/u -s | jq
注意:查看状态时URL路径使用单斜杠/
,而控制命令使用双斜杠//
。
更多关于golang跨平台*nix系统进程守护与管理插件库immortal的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang跨平台*nix系统进程守护与管理插件库immortal的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用immortal进行Golang跨平台*nix系统进程守护与管理
immortal是一个轻量级的*nix系统进程守护程序,用Go语言编写,可以确保进程持续运行并在崩溃时自动重启。下面我将详细介绍immortal的使用方法及示例代码。
安装immortal
首先需要安装immortal:
# 使用go get安装
go get -u github.com/immortal/immortal
# 或者下载预编译二进制
wget https://github.com/immortal/immortal/releases/download/0.24.3/immortal-0.24.3-linux-amd64.tar.gz
tar xvf immotal-*.tar.gz
sudo mv immortal /usr/local/bin/
基本使用
1. 启动守护进程
immortal /path/to/your/command --arg1 --arg2
2. 使用配置文件
创建YAML格式的配置文件(例如myapp.yml
):
cmd: /path/to/your/command
args:
- --arg1
- --arg2
env:
ENV1: value1
ENV2: value2
log:
file: /var/log/myapp.log
pid:
file: /var/run/myapp.pid
然后运行:
immortal -c myapp.yml
Golang集成示例
以下是一个完整的Golang程序示例,展示如何在自己的应用中集成immortal功能:
package main
import (
"fmt"
"log"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
// 设置信号处理
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
// 模拟一个需要守护的长期运行任务
go func() {
ticker := time.NewTicker(5 * time.Second)
defer ticker.Stop()
for {
select {
case <-ticker.C:
log.Println("Doing some work...")
// 这里可能会panic,测试immortal的自动重启
// if time.Now().Unix()%10 == 0 {
// panic("simulated panic")
// }
}
}
}()
// 等待退出信号
<-sigs
log.Println("Received termination signal, shutting down...")
}
高级配置示例
更复杂的immortal配置示例:
# advanced.yml
cmd: /usr/local/bin/myapp
args:
- --config=/etc/myapp/config.json
env:
APP_ENV: production
DB_HOST: 127.0.0.1
log:
file: /var/log/myapp/combined.log
age: 86400 # 日志保留时间(秒)
num: 7 # 保留的日志文件数
size: 1 # 日志文件大小(MB)
pid:
file: /var/run/myapp.pid
parent: /var/run/immortal.pid
stderr:
file: /var/log/myapp/error.log
stdout:
file: /var/log/myapp/output.log
管理守护进程
immortal提供了一些管理命令:
# 查看运行状态
immortalctl
# 输出示例:
# UP myapp 12345 5h3m /usr/local/bin/myapp
# 停止服务
immortalctl stop myapp
# 重启服务
immortalctl restart myapp
# 查看日志
tail -f /var/log/myapp.log
在systemd中使用immortal
可以将immortal作为systemd服务运行:
# /etc/systemd/system/myapp.service
[Unit]
Description=My App Service
After=network.target
[Service]
ExecStart=/usr/local/bin/immortal -c /etc/immortal/myapp.yml
Restart=always
User=myappuser
[Install]
WantedBy=multi-user.target
然后启用服务:
sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp
注意事项
- immortal适合守护无状态的进程,对于有状态的应用需要谨慎使用自动重启功能
- 频繁重启的进程可能会触发immortal的退避机制
- 日志轮转配置要合理,避免磁盘空间被占满
- 生产环境建议结合systemd或supervisor等工具一起使用
immortal提供了一种简单可靠的方式来守护您的应用程序进程,特别适合用Go编写的服务程序。通过合理的配置,可以确保服务的高可用性。