.net core3.1 webapi项目部署在centos7中,通过supervisor来做进程守护遇到backoff Exited too quickly (process log may have details)的错误--并提供解决方法


搞开发是不是很奇怪,昨天.net core3.1 webapi项目在linux中还跑的好好的,咋就过了一个周末为什么就报错了呢?这个错还很奇怪请看咱们的supervisor提供的日志信息

因为supervisor安装之后,supervisor 的服务端daemon在路径  /etc/ 项目对应的supervisor的配置需要在 /etc/supervisord.d/ 路径下去创建具体如何将.net core3.1 webapi 通过supervisor来守护进程请看点击

[.net core项目在 linux服务器部署的解决方法]    这里就不罗嗦,这是我将.net core3.1 webapi项目部署在supervisor进程守护工具中的配置,进入testfreesql.ini文件,

vim /etc/supervisord.d/testfreesql.ini

看到的信息如下:

[program:testfreesql] command=dotnet EmsTestFreeSqlMySql.dll --urls="http://*:5000" directory=/var/testfreesql/ environment=ASPNETCORE_ENVIRONMENT=Development user=root stopsignal=INT autostart=true autorestart=true startsecs=1 stderr_logfile=/var/log/EmsTestFreeSqlMySql.err.log stdout_logfile=/var/log/EmsTestFreeSqlMySql.out.log

阿西吧报这个错,蒙蔽状态 错误信息:backoff Exited too quickly (process log may have details) ,可以断定此处定妖孽作祟,好的,那咱就看看supervisor提供的日志信息把


 

在linux 查看日志命令

vim /var/log/EmsTestFreeSqlMySql.err.log

发现了妖孽

Unhandled exception. System.InvalidOperationException: Could not determine an appropriate location for storing user secrets. Set the DOTNET_USER_SECRETS_FALLBACK_DIR environment variable to a folder where user secrets should be stored.
at Microsoft.Extensions.Configuration.UserSecrets.PathHelper.GetSecretsPathFromSecretsId(String userSecretsId)
at Microsoft.Extensions.Configuration.UserSecretsConfigurationExtensions.AddUserSecrets(IConfigurationBuilder configuration, String userSecretsId, Boolean reloadOnChange)
at Microsoft.Extensions.Configuration.UserSecretsConfigurationExtensions.AddUserSecrets(IConfigurationBuilder configuration, Assembly assembly, Boolean optional, Boolean reloadOnChange)
at Microsoft.Extensions.Configuration.UserSecretsConfigurationExtensions.AddUserSecrets(IConfigurationBuilder configuration, Assembly assembly, Boolean optional)
at Microsoft.Extensions.Hosting.Host.<>c__DisplayClass1_0.<CreateDefaultBuilder>b__1(HostBuilderContext hostingContext, IConfigurationBuilder config)
at Microsoft.Extensions.Hosting.HostBuilder.BuildAppConfiguration()
at Microsoft.Extensions.Hosting.HostBuilder.Build()
at EmsTestFreeSqlMySql.Program.Main(String[] args) in E:\KCSoftwareTest\testFreesqlPro\EmsTestFreeSqlMySql\Program.cs:line 18

 

这些bug要加粗,是的看的更清楚些,这里的错误是说 “无法确定存储用户机密的适当位置”,报这个错主要原因找到:

第一,发布之后环境变量是Production,配置supervisor的时候写的是development

我们部署的时候linux先跳到自己的项目目录,然后  dotnet xxx.dll 跑一遍看看是什么环境

 

 然后根据 hosting environment:Production  在supervisor配置项目中环境变量也要一致 

改完之后再一次进入testfreesql.ini文件,

vim /etc/supervisord.d/testfreesql.ini

看到的信息如下:

[program:testfreesql] command=dotnet EmsTestFreeSqlMySql.dll --urls="http://*:5000" directory=/var/testfreesql/
#切记,这里的环境变量一定要跟发布项目的环境变量要一致 environment=ASPNETCORE_ENVIRONMENT=Development user=root stopsignal=INT autostart=true autorestart=true startsecs=1 stderr_logfile=/var/log/EmsTestFreeSqlMySql.err.log stdout_logfile=/var/log/EmsTestFreeSqlMySql.out.log

webapi项目配置到supervisor时,supervisor需要重新reread下,命令步骤如下:

supervisorctl reread
supervisorctl reload
supervisorctl update

登录supervisor后台就可以看到绿色的运行结果。

项目启动的时候一定要把配置注入到容器中,然后把环境变量加上去,

请看Program.cs的一个方法。

public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((hostbuilderContext, config) => {//报这个错之后定位加的配置注入,如果你要用到环境变量或者appsettings的配置一定要做这个注入 var env = hostbuilderContext.HostingEnvironment; var basedirectory = AppDomain.CurrentDomain.BaseDirectory; config.SetBasePath(basedirectory) .AddJsonFile("appsettings.json", true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", true, reloadOnChange: true) .AddEnvironmentVariables() //切记要添加环境变量 .AddCommandLine(args);//切记要添加这行 ; }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseKestrel(); webBuilder.UseUrls("http://*:5000"); webBuilder.UseStartup<Startup>(); }).ConfigureServices((services) => { services.AddHostedService<MainHostService>();//启动后台执行程序
                }).ConfigureLogging((logger) => { logger.ClearProviders(); logger.SetMinimumLevel(LogLevel.Trace); }).UseNLog();//加载Nlog

改完代码之后通过mobaxterm工具上传到centos7,通过supervisor后台可视化来管理.net core3.1 webapi 的进程。

啊,这个问题我整了一天,终于是搞定了,看下结果

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM