我在ASP.NET核心(.NET框架)中用
Process
班级:
var process = new Process
{
StartInfo = new ProcessStartInfo(executableDir)
{
Arguments = commandDefinition.CommandDef.ArgumentsAsString,
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true,
WorkingDirectory = _contentPath,
},
};
process.Start()
据我所知,当父进程(ASP.NET核心)被杀死时,子进程应该保持活动。我使用两个控制台应用程序测试了这种行为,并且子进程在杀死父进程后永远不会被杀死。
但是,当我在ASP.NET核心中生成一个新进程时,当出现以下情况时,子进程将被杀死:
-
IIS回收应用程序。
-
msdeploy发布了新版本的ASP.NET核心应用程序。
-
当使用dotnet watch并且在到期间重新启动应用程序时
代码更改。
只有当父级通过任务管理器被杀死时,它才会被杀死。(经过一些测试,情况并非总是如此)
从上面我怀疑ASP.NET核心中存在一种机制,在成功退出时会杀死所有子进程。它有文件记录吗?有没有办法避免?我找不到关于这种行为的任何信息。
编辑:
事实上,重拍很容易。
-
创建ASP.NET核心项目(.NET框架或.NET核心,无所谓)
-
将下面的代码添加到
Startup
班
-
启动Web应用程序。它将在IIS Express下托管。计算过程将开始。现在,要么通过任务管理器终止应用程序,要么通过IIS Express托盘图标关闭它。
-
计算过程将被终止。(有时需要尝试刷新脱机网页)
var process = new Process
{
StartInfo = new ProcessStartInfo("calc.exe")
{
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true,
},
};
process.Start();
伊迪丝2:问题似乎出在IIS上。我在launchsettings.json中有两个配置文件。如果我用iisexpress运行它,那么它会关闭,但是当使用第二个时,它会生存。
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "api/values",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"WebApplication3Core": {
"commandName": "Project",
"launchBrowser": true,
"launchUrl": "api/values",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:52135/"
}
编辑4:
我用过程监视器做了一些研究,结果如下:
正如您在SS1中看到的,iisexpress有一个“进程退出”操作,然后有许多不可逆日志,一段时间后,calc.exe有一个进程退出。这和正常出口没什么不同。唯一的区别是后一个日志写着“closefile”和我的web应用的路径,我不知道它的真正含义。
杀死calc.exe的肯定是IIS。我有IIS Express 10.0.14358版本(我发现的服务器版本也是10)