升级思路
- 服务先创建子进程执行升级脚本
- 脚本停止服务
- 脚本复制替换需要更新的文件
- 脚本再次启动服务
执行起来,发现脚本停止服务后,立马跟随服务一起停止。所以只能停止服务,后续步骤无法完成。无论是linux 还是windows,都有这种问题。
linux 和windows的服务思路
- windows 创建一个服务进程,然后利用服务进程守护work进程
- linux 服务进程无需创建,利用systemd守护work进程
问题原因
windows
服务进程创建work进程时,一般都会创建job,同时设置JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
效果是,只要服务进程退出,那么它创建的work进程也会全部退出,连同work进程的子进程,孙进程。。。
脚本随着work进程一并退出的原因就在这
其实也很好解决,利用JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK 就可以让work进程的子进程自动脱离Job,从而避免被杀
或者创建work进程时加上JOB_OBJECT_LIMIT_BREAKAWAY_OK,work进程创建子进程(升级)的时候设定CREATE_BREAKAWAY_FROM_JOB,也可以脱离Job避免被杀
linux
systemd(1)创建work进程时,默认是control-group,和windows的job作用类似
效果是,只要work进程退出,那么它创建的子进程,孙进程。。。也会全部退出
解法也很简单
设置 KillMode=process 就可以让work进程的子进程避免被杀
但是work的子进程管理就需要work进程自己精细控制了