在Linux服务器上使用supervisor把.Net Core控制台程序变成后台服务

9 篇文章 0 订阅
4 篇文章 0 订阅

supervisor的介绍详见:https://www.studyscript.com/Post/index/id/3038.html

安装supervisor

#yum install python-setuptools  //安装python安装工具
#easy_install supervisor  //安装supervisor

生成supervisor配置文件

建立目录,并赋予所有者可读、可写、可执行(700)权限

#mkdir -m 700 -p /etc/supervisor

创建配置文件

#echo_supervisord_conf > /etc/supervisor/supervisord.conf

修改配置文件

#vi /etc/supervisor/supervisord.conf

在文件的尾部添加如下配置:

;conf.d 为配置表目录的文件夹,需要手动创建
[include]
files = /etc/supervisor/conf.d/*.conf

如下图所示:

创建进程配置文件

创建进程配置文件存放目录

#mkdir -m 700 /etc/supervisor/conf.d

创建进程配置文件

#vi /etc/supervisor/conf.d/testsupervisor.conf

编辑内容

[program:AspNetCoreDeployDemo] ;程序名称,终端控制时需要的标识
command=dotnet AspNetCoreDeployDemo.dll ; 运行程序的命令
directory=/root/NetCore/FDD/ ; 命令执行的目录
autorestart=true ; 程序意外退出是否自动重启
stderr_logfile=/var/log/AspNetCoreDeployDemo.err.log ; 错误日志文件
stdout_logfile=/var/log/AspNetCoreDeployDemo.out.log ; 输出日志文件
environment=ASPNETCORE_ENVIRONMENT=Production ; 进程环境变量
user=root ; 进程执行的用户身份
stopsignal=INT
startsecs=10 ;自动重启时间间隔

创建supervisor自启动服务

#vi /lib/systemd/system/supervisor.service

编辑内容:

[Unit]
Description=supervisor
[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisorctl shutdown
ExecReload=/usr/bin/supervisorctl reload
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target

赋予权限:

#chmod 754 /lib/systemd/system/supervisor.service

设置开机自启动

#systemctl enable supervisor.service

运行服务

supervisorctl reload
supervisorctl start testsupervisor

出现错误不能成功运行,如果网上搜索 "supervisor Exited too quickly (process log may have details)”或按照supervisor日志里的错误信息搜索,多数会告诉你目录是否配置错误、目录是否有对应权限、dotnet 命令是否能正常运行等。

为控制台程序添加宿主

在asp.net core中我们都知道有个WebHost

asp.net core 中的WebHost

在控制台中我们需要添加HostBuilder来作为宿主。

通过Nuget 添加Microsoft.Extensions.Hosting

修改控制台的Main函数

{
    Console.WriteLine($"控制台程序已经启动:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}\r\n"); var hostBuilder = new HostBuilder()
   .ConfigureServices(serviceCollection => { //注册我们的服务接口
       serviceCollection.AddSingleton<IHostedService, MyService>();
   }); await hostBuilder.RunConsoleAsync();
}

一般情况Main函数改为异步后变异会报错,会提示找不到合适的静态入口;可以设置语言版本为C#7.1及以上来解决。

 

我们需要添加一个服务文类用来继承我们的宿主IHostedService接口,并重写服务启动和结束方法。

class MyService : IHostedService
    { /// <summary>
        /// 服务启动 /// </summary>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public Task StartAsync(CancellationToken cancellationToken)
        { return Task.Run(() => {
                Console.WriteLine("控制台程序已经开启"); //模拟定时需要后台处理的任务
                new Task(() => { while (true)
                    {
                        Console.WriteLine("当前时间是:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
                        Thread.Sleep(1000);
                    }
                }).Start();

            });
        } /// <summary>
        /// 服务停止 /// </summary>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public Task StopAsync(CancellationToken cancellationToken)
        { return Task.Run(() => {
                Console.WriteLine("控制台程序已经停止");
            });

       }
    }

发布然后使用supervisorctl start testsupervisor 开启看看.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值