zoukankan      html  css  js  c++  java
  • .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 estFreesqlProEmsTestFreeSqlMySqlProgram.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 的进程。

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

     

     

  • 相关阅读:
    hbase中double类型数据做累加
    kafka的分区模式?
    hive 定时加载分区
    在shell 中字符串,文件,数字的比较
    idea中maven依赖不能下载的解决办法
    Required field 'client_protocol' is unset! Struct:TOpenSessionReq(client_protocol:null, configuration:{use:database=default}) (state=08S01,code=0)
    SparkSQL ThriftServer服务的使用和程序中JDBC的连接
    hbase计数器
    hbase常用命令
    object not serializable (class: org.apache.kafka.clients.consumer.ConsumerRecord)
  • 原文地址:https://www.cnblogs.com/axinno1/p/14858337.html
Copyright © 2011-2022 走看看