golang跨平台*nix系统进程守护与管理插件库immortal的使用

Golang跨平台*nix系统进程守护与管理插件库immortal的使用

概述

immortal是一个*nix跨平台(操作系统无关)的进程守护工具,可以帮助您管理和守护系统进程。

安装方法

从源码编译安装

  1. 设置Go环境(需要Go >= 1.12)
$ export GOPATH=$HOME/go
  1. 创建目录并克隆项目
$ mkdir -p $HOME/go/src/github.com/immortal
$ git clone git@github.com:immortal/immortal.git $HOME/go/src/github.com/immortal/immortal
  1. 编译和安装
$ 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: 依赖的服务(需要先启动的服务)

如果foobar没有运行,www服务将不会启动。可以省略agenumsize选项来完全禁用日志轮转。

目录结构

使用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

1 回复

更多关于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

注意事项

  1. immortal适合守护无状态的进程,对于有状态的应用需要谨慎使用自动重启功能
  2. 频繁重启的进程可能会触发immortal的退避机制
  3. 日志轮转配置要合理,避免磁盘空间被占满
  4. 生产环境建议结合systemd或supervisor等工具一起使用

immortal提供了一种简单可靠的方式来守护您的应用程序进程,特别适合用Go编写的服务程序。通过合理的配置,可以确保服务的高可用性。

回到顶部