C# Net6开发Linux守护进程(后台服务程序,类似Windows服务)案例

  • 背景
  • C# net6开发Linux守护进程要点

背景

在使用net6开发Linux程序时,除了AspNet Core项目外,如果是开发的一个不带Web界面,只是后台运行的控制台程序的话,默认发布到Linux系统时,如果是以start-stop-daemon方式(守护进行方式)启动运行的话,默认是不行的,程序会自动终止,因为在Linux下dotnet程序运行是以会话的方式。那么要如何实现类似Windows服务的方式在后台运行。下面就介绍一下要点吧。

C# net6开发Linux守护进程要点

1、在VS2022中新建控制台项目。
2、在项目的NuGet程序包中安装Microsoft.Extensions.Hosting依赖包。
3、修改Program.cs,以构建Host并运行,详细代码案例如下:
Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;namespace DataCollectServiceApp
{public class Program{static void Main(string[] args){CreateHostBulder(args).Build().Run();}public static IHostBuilder CreateHostBulder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureServices((hostContext, services) =>{services.AddHostedService<SyncService>();});}
}

SyncService.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;namespace DataCollectServiceApp
{using Wongoing.Entity;using Wongoing.Data.Service;/// <summary>/// 异步后台服务类/// </summary>public class SyncService : BackgroundService{#region 构造方法public SyncService(){}#endregion#region 服务启、停/// <summary>/// 服务启动/// </summary>/// <param name="cancellationToken"></param>/// <returns></returns>public override async Task StartAsync(CancellationToken cancellationToken){Console.WriteLine("Press key Ctrl + C to stop the Service!");await base.StartAsync(cancellationToken);}/// <summary>/// 主定时任务/// </summary>/// <param name="stoppingToken"></param>/// <returns></returns>protected override async Task ExecuteAsync(CancellationToken stoppingToken){while (!stoppingToken.IsCancellationRequested){//每秒执行一次定时任务Console.WriteLine("执行定时任务...");await Task.Delay(1000, stoppingToken);}}/// <summary>/// 服务停止/// </summary>/// <param name="cancellationToken"></param>/// <returns></returns>public override async Task StopAsync(CancellationToken cancellationToken){Console.WriteLine("The Service is stoped!");await base.StopAsync(cancellationToken);}#endregion}
}

要点是后台服务要使用Microsoft.Extensions.Hosting.BackgroundService。
这样的程序发布到Linux系统后,就可以通过start-stop-daemon的方式启动。

案例如下:

#!/bin/sh
#
# Start DataCollectServiceApp
# start() {printf "Starting DataCollectServiceApp: "cd /opt/apps/DataCollectServiceAppstart-stop-daemon -b -S -q -m -p /opt/apps/DataCollectServiceApp/DataCollectServiceApp.pid --exec /usr/bin/dotnet -- /opt/apps/DataCollectServiceApp/DataCollectServiceApp.dllecho "OK"
}stop() {printf "Stopping DataCollectServiceApp: "start-stop-daemon -K -q -p /opt/apps/DataCollectServiceApp/DataCollectServiceApp.pidecho "OK"
}case "$1" instart)start;;stop)stop;;restart|reload)stopstart;;*)echo "Usage: $0 {start|stop|restart}"exit 1
esacexit $?

C# Net6开发Linux守护进程(后台服务程序,类似Windows服务)案例相关推荐

  1. .NET跨平台实践:再谈用C#开发Linux守护进程 — 完整篇

    Linux守护进程是Linux的后台服务进程,相当于Windows服务,对于为Linux开发服务程序的朋友来说,Linux守护进程相关技术是必不可少的,因为这个技术不仅仅是为了开发守护进程,还可以拓展 ...

  2. .NET跨平台实践:用C#开发Linux守护进程

    Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为L ...

  3. .NET跨平台实践:.NetCore、.Net5/6 Linux守护进程设计

    几年前,我写过两篇关于用C#开发Linux守护进程的技术文章,分别是<.NET跨平台实践:用C#开发Linux守护进程.NET跨平台实践:再谈用C#开发Linux守护进程 - 完整篇 这就是本文 ...

  4. 深入理解Linux守护进程

    深入理解Linux守护进程Linux服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台的守护进程(daem ...

  5. 【Linux】Linux 守护进程的启动方法

    转载:Linux 守护进程的启动方法 "守护进程"(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的由来 W ...

  6. Linux守护进程编写

    Linux守护进程编写 环境:VMware 15 + ubuntu 16 内核:4.19 护进程的特点 后台服务程序,随系统启动而启动. 很多系统服务通过守护进程完成. 守护进程的名字往往以字母'd' ...

  7. 笔记整理--Linux守护进程

    Linux多进程开发(三)进程创建之守护进程的学习 - _Liang_Happy_Life__Dream - 51CTO技术博客 - Google Chrome (2013/10/11 16:48:2 ...

  8. linux 守护进程_Linux 守护进程

    前言 Linux 平台下,经常需要程序脱离终端在后台运行,很多程序在启动的时候需要加 -d 参数,这一般代表以守护进程(后台进进程)的方式启动.那么怎么启动守护进程呢? 创建方式 //程序退出的默认动 ...

  9. linux+守护进程+php,【转载】Linux 守护进程的编程方法

    [转载]Linux 守护进程的编程方法 原文见: http://www.linuxdevelop.org/tingxx/show.php?table=c&id=3 Linux 守护进程的编程方 ...

最新文章

  1. Spring-Boot的动态代理AOP原理
  2. 聊一聊工作中如何优雅的通过TDD方式来维护一个高质量的NPM包
  3. 报名丨图神经网络前沿学术研讨会:清北高校vs企业,9位学者联袂分享
  4. Scrapy介绍及入门
  5. numpy 辨异(二) —— np.identity()/np.eye()
  6. Spring开发人员知道的一件事
  7. CoreAnimation编程指南(六)动画
  8. 《游戏行业DDoS攻击解决方案》重磅发布
  9. 填平数据、产品、模式需求鸿沟,浪潮云发布新一代行业云 MEP战略
  10. linux文件压缩包,linux目录文件压缩包操作
  11. oracle 分组 top10 sql,oracle sql 合龙 分组 聚合函数
  12. securecrt遇到一个致命的错误且必须关闭_谈谈如何利用 valgrind 排查内存错误
  13. solr java api_Solr7.4.0的API(Solrj)操作
  14. 计算机主板日常维护主要做到什么,对计算机硬件日常维护的热点研究
  15. Vivado_ILA IP核
  16. 网络安全——lcx的使用
  17. 线下综合体-中岛店的一些思考
  18. FL Studio 20音乐制作教程
  19. ipad无线无法连接到服务器,ipad无法连接无线路由器原因有哪些【解决方法】
  20. Flink保证exactly-once机制介绍:checkpoint及TwoPhaseCommitSinkFunction

热门文章

  1. Visual C++游戏编程基础之追逐移动
  2. 视频会员订单数据清洗
  3. python 内置函数 setattr()
  4. 第71课:Spark SQL窗口函数解密与实战学习笔记
  5. Win10只有飞行模式,没有WLAN图标
  6. 清空C++ sstream缓冲区
  7. manacher介绍及图文讲解(用于求解最长回文子串)
  8. PyCharm 破解激活 教程
  9. oracle中inner left right full 的使用
  10. 实现一个红绿灯效果,每次红灯亮 10 秒,绿灯亮 8 秒,黄灯亮 3 秒,并在红绿灯右侧显示倒计时