immortal
是一款非常方便的 supervisor 类型的进程监管工具。其作用是让一个程序以 Daemon 方式(后台方式)运行,并在程序意外退出时进行重启的工具。
immortal 的官网是 immortal.run。
1 安装
immortal 并不是操作系统默认的工具,因此绝大多数情况下都需要手动安装。官网上提供了大多数常见操作系统的安装方法。我们这里以 Ubuntu 系统为例。运行下面的命令:
1 | curl -s https://packagecloud.io/install/repositories/immortal/immortal/script.deb.sh | sudo bash |
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 | cmd: <command to execute> |
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 | -1 USR1 |
2.3 immortaldir
这个命令会监控一个文件夹,根据文件夹里面的 *.yml
文件来监管进程:
1 | immortaldir [dir] [-v] |
在 Linux 环境下,目标目录会每 5 秒被扫描一次。默认路径的位置可能是
1 | /usr/local/etc/immortal |
或者是
1 | /etc/immortal |