今日做项目,通过systemctl去管理服务A。因为A依赖很多动态库,所以实际执行的时候,是由B这个脚本将A带起来。这样,systemctl start A时,实际上是B先运行起来,然后B将A带起来。然后systemctl stop A时,kill了B,同时也将A杀死。
用systemctl,以服务的形式来管理时,发现父进程退出时,子进程就会自动退出。
但是如果不用systemctl来管理呢?仅仅通过bash来运行脚本B,发现A运行起来了。但是手动去kill掉B这个脚本时,A程序仍然在运行。
查了一下资料,发现如果需要“父进程退出后,子进程自动消亡”,一种简单的办法是在子进程中调用
prctl(PR_SET_PDEATHSIG, SIGHUP);或者
prctl(PR_SET_PDEATHSIG, SIGTERM)
这个函数的作用是,当父进程挂掉后,会发送SIGHUP或者SIGTERM信号给子进程。做了测试程序,果然,这次关掉B脚本后,A就退出了。后来又在A的代码中加了个信号处理函数,处理了SIGTERM和SIGHUP,发现kill掉B脚本的时候,A确实接收到了信号。