Supervisor 相信对Linux系统很熟的都知道这个软件,基于Python写的一个守护进程软件(实现后台运行)。具体的介绍和使用我就不再赘述了。

使用asp.net core 部署在Linux常用的方法 我们可以用Docker、Jexus 、Supervisor等。具体应该使用哪个,因不同的软件都有各自的优缺点,根据自身应用的场景选择一个即可。

在使用Supervisor  部署asp.net core的时候通常我们只要在supervisord.d 目录中添加对应的配置文件如xxx.ini或xxx.conf。(具体目录位置和配置文件扩展名请根据supervisord.conf来进行配置约束。)

然后在配置文件command 后面写上dotnet /data/web/webapi.dll ,然后通过 supervisorctl start webapi 即可启动我们的web程序在后台运行。

当我们在DotNet Core中写一个后台程序,比如定时任务程序、MQ的消费者程序等。这样就没必要写成Web程序;在windows里我们可以写一个windows服务程序,直接在后台运行。但是DotNet Core我们只能写控制台程序了。

普通的控制台程序我们写好后放到Linux上直接运行没问题,但是如果使用supervisor 进行部署实现后台进程守护(部署方式同asp.net core一样),会发现 怎么也启动不了。

比如这样一个程序

Linux上直接运行(前台方式),可以完美执行。

使用Supervisord部署添加一个配置文件

使用supervisor运行,会出现错误。

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

我们看看运行日志

这样看是有运行,出现【控制台程序已经启动】多次说明我们的程序被Supervisor 多次重启了,在配置文件中startretries就是启动失败后重启次数。

我们可以通过tail -f /data/logs/apptest.log 查看日志有没有文件有没有继续持续输出我们打印的时间或者通过ps -efl |grep dotnet 查看当前程序运行的进程是否存在,后者是最准确的。

不难发现我们本次是有运行 因为有启动日志,但是很快进程就会自动退出了。

为控制台程序添加宿主

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

asp.net core 中的WebHost

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

通过Nuget 添加Microsoft.Extensions.Hosting

修改控制台的Main函数

static async Task Main(string[] args)
{
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();
}
}).Start(); });
}
/// <summary>
/// 服务停止
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.Run(() =>
{
Console.WriteLine("控制台程序已经停止");
}); }
}

发布然后使用supervisorctl start apptest 开启看看

Supervisor守护DotNet Core控制台程序的更多相关文章

  1. 【ASP.NET Core分布式项目实战】(五)Docker制作dotnet core控制台程序镜像

    Docker制作dotnet core控制台程序镜像 基于dotnet SDK 新建控制台程序 mkdir /home/console cd /home/console dotnet new cons ...

  2. Docker制作dotnet core控制台程序镜像

    (1)首先我们到某个目录下,然后在此目录下打开visual studio code. 2.编辑docker file文件如下: 3.使用dotnet new console创建控制台程序; 4.使用d ...

  3. VisualStudioCode创建的asp.net core控制台程序部署到linux

    1.asp.net core控制台程序 static void Main(string[] args) { ; ) { Console.WriteLine("Hello World!&quo ...

  4. 大比速:remoting、WCF(http)、WCF(tcp)、WCF(RESTful)、asp.net core(RESTful) .net core 控制台程序使用依赖注入(Autofac)

    大比速:remoting.WCF(http).WCF(tcp).WCF(RESTful).asp.net core(RESTful) 近来在考虑一个服务选型,dotnet提供了众多的远程服务形式.在只 ...

  5. 在.NET Core控制台程序中使用依赖注入

    之前都是在ASP.NET Core中使用依赖注入(Dependency Injection),昨天遇到一个场景需要在.NET Core控制台程序中使用依赖注入,由于对.NET Core中的依赖注入机制 ...

  6. .Net Core 控制台程序错误:Can not find runtime target for framework '.NETCoreApp,Version=v1.0' compatible with one of the target runtimes: 'win10-x64, win81-x64, win8-x64, win7-x64'.

    .Net Core 控制台程序错误:Can not find runtime target for framework '.NETCoreApp,Version=v1.0' compatible wi ...

  7. 如何在.NET Core控制台程序中使用依赖注入

    背景介绍 依赖注入(Dependency Injection), 是面向对象编程中的一种设计原则,可以用来减低代码之间的耦合度.在.NET Core MVC中 我们可以在Startup.cs文件的Co ...

  8. NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions

    .NET Core 控制台程序没有 ASP.NET Core 的 IWebHostBuilder 与 Startup.cs ,那要读 appsettings.json.注依赖.配日志.设 IOptio ...

  9. [C#]使用 C# 代码实现拓扑排序 dotNet Core WEB程序使用 Nginx反向代理 C#里面获得应用程序的当前路径 关于Nginx设置端口号,在Asp.net 获取不到的,解决办法 .Net程序员 初学Ubuntu ,配置Nignix 夜深了,写了个JQuery的省市区三级级联效果

    [C#]使用 C# 代码实现拓扑排序   目录 0.参考资料 1.介绍 2.原理 3.实现 4.深度优先搜索实现 回到顶部 0.参考资料 尊重他人的劳动成果,贴上参考的资料地址,本文仅作学习记录之用. ...

随机推荐

  1. Ocelot中文文档-架构图

    Ocelot 针对的是,使用.net运行微服务和面向服务架构,并且需要一个统一的入口来访问他们系统的人群. 特别是,我想要与IdentityServer和令牌轻松集成. Ocelot是一组有特定顺序的 ...

  2. Android 源码中的设计模式

    最近看了一些android的源码,发现设计模式无处不在啊!感觉有点乱,于是决定要把设计模式好好梳理一下,于是有了这篇文章. 面向对象的六大原则 单一职责原则 所谓职责是指类变化的原因.如果一个类有多于 ...

  3. 百度搜索(jsonp)

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>百 ...

  4. PAT1127:ZigZagging on a Tree

    1127. ZigZagging on a Tree (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue ...

  5. ARM-Linux中断系统

    1.前言 了解Linux中断子系统,同时也需要了解ARM体系结构中断处理流程:在熟悉整个软硬件架构和流程基础上,才能对流程进行细化,然后找出问题的瓶颈.<2. 梳理中断处理子系统> 但是所 ...

  6. npm安装项目出错

    F:\ajax>npm install iview --savenpm WARN saveError ENOENT: no such file or directory, open 'F:\aj ...

  7. Spring Batch 专题

    如今微服务架构讨论的如火如荼.但在企业架构里除了大量的OLTP交易外,还存在海量的批处理交易.在诸如银行的金融机构中,每天有3-4万笔的批处理作业需要处理.针对OLTP,业界有大量的开源框架.优秀的架 ...

  8. VM10虚拟机安装图解

    支持32位windows操作系统和64位操作系统的VM10虚拟机 ============= 下载虚拟机: VM10虚拟机下载网址+Vm10的激活秘钥  https://jingyan.baidu.c ...

  9. python 简单的信息管理系统

    #!/usr/bin/python #coding=utf-8 import io import os import time FileRead = io.open('callingcard','r' ...

  10. java Queue中 add/offer,element/peek,remove/poll区别

    转自https://blog.csdn.net/u012050154/article/details/60572567 java Queue中 add/offer,element/peek,remov ...