子进程管理
supervisor是通过fork直接创建子进程,但是fork后支持同样的supervisor进程的逻辑,后续通过 fork 函数返回的pid确定当前进程是父进程还是子进程,父进程pid非零,值为子进程的pid,子进程中pid为零
子进程中后续逻辑
- 修改当前进程的名称,分组以及进程的所属用户
- 配置当前进程的标准输入和输出对应的管道
- 使用os.execve函数启动配置的程序,由于被管理的程序都是前台运行,故当前子进程也就阻塞并一直运行在对应的被管理的程序逻辑中,这使得当前子进程其实就相当于被管理程序进程
参考源码文件:
- process.py:进程创建管理相关
- supervisord.py:主入口文件
日志管理
子进程创建的时候包含专属的管道来处理标准输入和输出,父进程中管道对应的文件描述符是交由select或者poll来管理,在不同的类unix系统上使用不同的IO多路复用机制来处理。
参考源码文件:
- process.py:进程创建管理相关
- supervisord.py:主入口文件
- poller.py:IO多路复用适配
- loggers.py:日志定义
