STTNet 0.7.0

第 19 章:进程拉起、守护、心跳与进程间同步

本章说明进程拉起、传统守护进程、共享内存心跳和 System V 信号量的职责边界。

1. Process、HBSystem 与 csemp 的职责

作用不是
Processfork/exec 或执行函数;可由辅助进程定时重启不是完整 daemonize
HBSystem共享内存登记进程、续约、检测超时、终止并重启不是跨机器注册中心
csempSystem V 信号量,进程间互斥不是线程互斥锁

2. Process::startProcess

// sec=-1:只启动一次。
stt::system::Process::startProcess(
    "/usr/local/bin/worker",
    -1,
    "worker", "--port", "9000");

// sec=3:目标退出后,辅助进程等待 3 秒再重新拉起。
stt::system::Process::startProcess(
    [] {
        runWorker();
    },
    3);

它不会调用 setsid()、切换工作目录、设置 umask 或重定向标准输入输出,因此准确说法是进程拉起/监督,而不是传统 Unix 守护进程。生产环境通常由 systemd、容器编排或专门的进程管理器补充完整的生命周期管理。

3. HBSystem 心跳模型

  1. 业务进程调用 join() 登记路径、PID 和最多三个参数。
  2. 业务进程定期调用 renew() 更新心跳。
  3. 独立监控进程周期性调用 HBCheck(sec)
  4. 超时后发送 SIGTERM (15) 并等待 8 秒;进程仍存活时发送 SIGKILL (9),随后按登记信息重新拉起。
当前限制:使用固定 System V IPC key 0x5095,最多记录 1000 个进程,参数字段长度有限且最多三个参数。一个主机上部署多个独立 STTNet 集群前应规划冲突问题。

4. csemp 进程间锁

stt::system::csemp lock;
if(!lock.init(0x6001))
    return 1;

lock.wait();
// 访问多个进程共享的资源。
lock.post();

// 只由明确的资源所有者在生命周期结束时销毁。
lock.destroy();

5. 信号和退出

被监督服务仍包含第 17 章描述的优雅退出路径。SIGKILL (9) 无法捕获,仅用于 SIGTERM (15) 和宽限期均未完成退出的场景。

进程监督 Demo →