NewLifeX / NewLife.Agent

应用程序注册为系统服务,支持Windows/Linux

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Ubuntu系统下AspNetMVC项目调用systemctl stop 无法优雅退出

wqliceman opened this issue · comments

commented

你好!最近集成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
`

commented

已提交pull request

commented

这是个好主意!

根据涉及,stop的时候,应该调用ServiceBase的StopWork方法,是不是里面耗时过长?

commented

通过排查不是耗时太长的操作,从我自己项目我分析出的原因如要是如下情况:

  1. 当linux执行systemctl stop xxxx 的时候
  2. 这个stop的命令被aspnet core里面的stop接收到了,此时aspnet服务内部调用了stop并关闭了服务
  3. 但是此时NewLife.Agent外面包装的这一层一直未收到stop指令,导致一直不调用Agent这层的stop。直到超时(我猜测是Agent内部好像是1分钟执行一次Check是否退出)
    (我使用的是Agent内部的样例项目new 一个 MyService 里面执行Build这个实例)
commented

Agent的ServiceBase内部有个DoLoop,循环调用DoCheck检测健康状况,依赖于_running。
而服务启动时,把多种退出事件注册到OnProcessExit,其中会调用StopWork。

commented

#6 (comment)
这个原理我看懂的了。实际情况是未收到OnProcessExit事件。导致未调用StopWork。从而就导致进程一直挂起
image
不会调用到圈中地方