immortal 是一款非常方便的 supervisor 类型的进程监管工具。其作用是让一个程序以 Daemon 方式(后台方式)运行,并在程序意外退出时进行重启的工具。

immortal 的官网是 immortal.run

1 安装

immortal 并不是操作系统默认的工具,因此绝大多数情况下都需要手动安装。官网上提供了大多数常见操作系统的安装方法。我们这里以 Ubuntu 系统为例。运行下面的命令:

1
2
$ curl -s https://packagecloud.io/install/repositories/immortal/immortal/script.deb.sh | sudo bash
$ apt install immortal

2 使用

immortal 提供了三个命令,分别是

  • immortal: 运行并监管一个服务(进程);
  • immortaldir: 监听一个路径,使用其中的 *.yml 文件来创建服务;
  • immortalctl: 控制已有的服务。

2.1 immortal

immortal 命令的形式如下:

1
immortal [-v] [-ctl dir] [-d dir] [-e dir] [-f pidfile] [-l logfile] [-logger logger] [-p child_pidfile] [-P supervisor_pidfile] [-u user] command

其中比较重要的flag有:

  • -d dir: 在运行前切换到这个目录;
  • -e dir: 设定环境变量。这个比较特殊。指定一个目录,目录中的文件名为变量名,文件的内容为变量值;
  • -f pidfile: 进程的 pid 存储的文件。一般最好提供这个文件,以避免进程调度过程中的错误;
  • -l logfile: stdout 和 stderr 的内容会被转到这个文件;
  • -w seconds: 再开始进程之前等待这个时间;
  • -u user: 用来运行进程的用户;
  • -r <int>: 在退出程序前最多重试的次数。默认是 0,表示无限重复;

可以将配置写到一个yaml文件里面传递给 immortal-c <service name>.yaml: 这个文件的基本形式是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cmd: <command to execute>
cwd: <change workding directory> # option -d
env: # option -e
<key>: <value>
pid:
follow: <pidfile> # option -f
parent: <pidfile> # option -P
child: <pidfile> # option -p
log:
file: <path> # option -l
age: <int> # seconds
num: <int> # int
size: <int> # MegaBytes
timestamp: <bool> # prefix log with timestamp
logger: <command> # option -logger
user: <user> # option -u
wait: <int> # option -s
require: # list of services needed before starting
- foo
- bar

immortal 在运行程序之后会为这个进程创建一个监管文件夹。这个监管文件夹的位置可以使用 -ctl 来制定。全局的默认位置是 /var/run/immortal。每个进程有一个独立的文件夹,文件夹的名字是 PID。文件夹中的文件有两个,分别是

  • lock
  • immortal.sock

这里有一个 sock 文件,表明 immortal 可以通过 socket 来查询和管理被监管的进程。这个我们后续再补充介绍。现阶段一般用不到。

用命令行的 immortal 命令,而非以 root 用户运行 immortaldir 时,这个监管文件夹的根目录会放在用户的home目录下的一个隐藏文件夹中:

1
~/.immortal/<PID>

2.2 immortalctl

命令的基本形式是:

1
immortalctl [options] [-12achikinouqstvw] [*|service]

immortalctl 通过查询监管文件夹中的内容来索引被监管的进程。单纯运行 immortalctl 会输出当前运行的进程的列表。列表的形式是

1
PID   Up   Down   Name   CMD

其中 Up 表示程序已经运行的时间。Down 则表示程序已经停止。

命令中的 option 可以是

  • exit: 退出。这个命令会退出 immortal 进程,一般不会调用;
  • halt: 停止对应的服务,默认发送 TERM 信号;如果这个服务是被 immortaldir 监管的,那么这个服务会被重启;
  • once: 开始一个服务,且这个服务停止以后不会进行重启;
  • start: 开始一个服务;
  • stop: 停止服务;

命令说明中 -12achikinouqstw 代表了发送给进程的信号:

1
2
3
4
5
6
7
8
9
10
11
12
13
-1        USR1
-2 USR2
-a ALRM
-c CONT
-h HUP
-i INT
-k KILL
-in TTIN
-ou TTOU
-q QUIT
-s STOP
-t TERM
-w WINCH

2.3 immortaldir

这个命令会监控一个文件夹,根据文件夹里面的 *.yml 文件来监管进程:

1
immortaldir [dir] [-v]

在 Linux 环境下,目标目录会每 5 秒被扫描一次。默认路径的位置可能是

1
/usr/local/etc/immortal

或者是

1
/etc/immortal