子进程管理

supervisor是通过fork直接创建子进程,但是fork后支持同样的supervisor进程的逻辑,后续通过 fork 函数返回的pid确定当前进程是父进程还是子进程,父进程pid非零,值为子进程的pid,子进程中pid为零
子进程中后续逻辑

  1. 修改当前进程的名称,分组以及进程的所属用户
  2. 配置当前进程的标准输入和输出对应的管道
  3. 使用os.execve函数启动配置的程序,由于被管理的程序都是前台运行,故当前子进程也就阻塞并一直运行在对应的被管理的程序逻辑中,这使得当前子进程其实就相当于被管理程序进程

参考源码文件:

  • process.py:进程创建管理相关
  • supervisord.py:主入口文件

日志管理

子进程创建的时候包含专属的管道来处理标准输入和输出,父进程中管道对应的文件描述符是交由select或者poll来管理,在不同的类unix系统上使用不同的IO多路复用机制来处理。
参考源码文件:

  • process.py:进程创建管理相关
  • supervisord.py:主入口文件
  • poller.py:IO多路复用适配
  • loggers.py:日志定义