Ubuntu系统下AspNetMVC项目调用systemctl stop 无法优雅退出
wqliceman opened this issue · comments
你好!最近集成Agent项目作为跨平台服务安装卸载操作,一直有个问题困扰我,就是通过LInux系统调用systemctl stop无法优雅退出,需要等等大概30s到超时才能正常退出,期间我也尝试找代码原因如何规避,一直无法很好解决。今天突然尝试调整生成的systemd service文件在区段[Service]中增加 KillSignal=SIGINT 这可发送及时信号进行退出,是否可以直接调整代码增加该行?
`[Unit]
Description=IDB serivce
[Service]
Type=simple
ExecStart=/test/ws/main_svc/Test.MainWS.Web -s
WorkingDirectory=/test/ws/main_svc
Restart=on-failure
KillSignal=SIGINT
[Install]
WantedBy=multi-user.target
`
已提交pull request
这是个好主意!
根据涉及,stop的时候,应该调用ServiceBase的StopWork方法,是不是里面耗时过长?
通过排查不是耗时太长的操作,从我自己项目我分析出的原因如要是如下情况:
- 当linux执行systemctl stop xxxx 的时候
- 这个stop的命令被aspnet core里面的stop接收到了,此时aspnet服务内部调用了stop并关闭了服务
- 但是此时NewLife.Agent外面包装的这一层一直未收到stop指令,导致一直不调用Agent这层的stop。直到超时(我猜测是Agent内部好像是1分钟执行一次Check是否退出)
(我使用的是Agent内部的样例项目new 一个 MyService 里面执行Build这个实例)
Agent的ServiceBase内部有个DoLoop,循环调用DoCheck检测健康状况,依赖于_running。
而服务启动时,把多种退出事件注册到OnProcessExit,其中会调用StopWork。
#6 (comment)
这个原理我看懂的了。实际情况是未收到OnProcessExit事件。导致未调用StopWork。从而就导致进程一直挂起
不会调用到圈中地方