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. ubuntu导入公钥的方法

    导入公钥的办法: #方法1: gpg --keyserver subkeys.pgp.NET --recv 6E871C4A881574DEgpg --export --armor 6E871C4A8 ...

  2. git如何移除某文件夹的版本控制

    目录结构如下 project bin lib src ...... 执行如下的操作 git add . git commit -m "add bin/ lib/ src/" git ...

  3. MAC OSX下用pip安装lxml时遇到xmlversion.h not found的解决办法

    http://blog.csdn.NET/wave_1102/article/details/37730589 今天在Mac下用pip安装lxml,总是报如下错误: etree_defs.h::: f ...

  4. 从零开始的H5生活

    作为一个新手,要从头学习Html编程语言,需要从最基础的开始.有耐心慢慢来,很容易就看懂了.我所使用的编程软件是Hbuilder. 1.Html文档结构 包括head和body两部分 <!DOC ...

  5. ES 在聚合结果中进行过滤

    ES查询中,先聚合,在聚合结果中进行过滤 { "size": 0, "aggs": { "terms": { "terms&quo ...

  6. 洛谷 P1272 解题报告

    P1272 重建道路 题目描述 一场可怕的地震后,人们用\(N\)个牲口棚\((1≤N≤150\),编号\(1..N\))重建了农夫\(John\)的牧场.由于人们没有时间建设多余的道路,所以现在从一 ...

  7. swagger上传文件并支持jwt认证

    背景 由于swagger不仅提供了自动实现接口文档的说明而且支持页面调试,告别postman等工具,无需开发人员手动写api文档,缩减开发成本得到大家广泛认可 但是由于swagger没有提供上传文件的 ...

  8. Manifest文件的最新理解

    今天看了Manifest文件内容的相关视频,感觉对知识的理解深刻了一些: 首先,先来说说这个文件的作用,这个文件可以说是聚集了很多个标签,其实对于每个主标签,在将来编译的时候,都会被处理成一个类,而标 ...

  9. Bash特殊变量:$0, $#, $*, $@, $?, $$实战

    在linux下配置shell参数说明 前面已经讲到,变量名只能包含数字.字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量. 例如,$ 表示当前Shell进程的ID,即pid ...

  10. 20.QT-Qpixmap实现图片鼠标缩放,鼠标拖动示例(详解)

    通过 QPainter 绘画实现,以本地图片985*740为例 如下图所示: 效果如下所示: 实现原理 主要通过以下函数实现: , ); //平铺显示pixmap //x y w h :表示绘画区域 ...