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

一句话,为Linux开发与控制台无关的,需要在后台长时间不间断运行的“服务程序”,Daemon技术是非常重要的。

Daemon程序一般用c/c++开发。不过,我今天要讲的,不是怎么用c/c++开发daemon,而是用C#!

一,创建Daemon程序:

用VS新建一个控制台项目,假设名称是MyDaemon,输入下边的代码:

using System.Runtime.InteropServices; using System.Threading;

namespace MyDaemon
{     class Program{        

        static void Main(string[] args){                int pid = fork();                   if (pid != 0)                 exit(0);      //设置“会话组长”,与父进程脱离                setsid();pid = fork();               if (pid != 0) exit(0);   //已经进程“守护进程”工作状态了!            //关闭所有打开的文件描述符int max = open("/dev/null", 0);               for (var i = 0; i <= max; i++)             { close(i); }                   //重设文件掩模umask(0);            //执行你的程序过程                      DaemonMain(args);}        /// <summary>/// Daemon工作状态的主方法        /// </summary>/// <param name="aargs"></param>static void DaemonMain(string[] aargs){                       //你的工作代码...               //daemon时,控制台输入输出流已经关闭               //请不要再用Console.Write/Read等方法//阻止daemon进程退出                     while (true){ Thread.Sleep(1000); }}[DllImport("libc", SetLastError = true)]         static extern int fork();[DllImport("libc", SetLastError = true)]        static extern int setsid();[DllImport("libc", SetLastError = true)]         static extern int umask(int mask);[DllImport("libc", SetLastError = true)]        static extern int open([MarshalAs(UnmanagedType.LPStr)]string pathname, int flags);[DllImport("libc", SetLastError = true)]        static extern int close(int fd);[DllImport("libc", SetLastError = true)]          static extern int exit(int code);}
}

然后编译为 MyDaemon.exe。

二,部署和运行:

.net 程序在linux运行,一般都会使用mono这个.net框架,不过,为了简单方便,我这里使用 AnyExec来运行这个程序(关于AnyExec,请参阅:不装mono,你的.NET程序照样可以在Linux上运行!)。

1,把 MyDeamon.exe放到anyexec的app文件夹;

2,把 "any"这个程序复制为 MyDeamon;

3,运行:见证神奇的时间到了!请你在linux控制终端上输入: ./MyDaemon,哈哈,怎么没有反应? 其实,不是没有反应,是你这个 MyDaemon程序已经在后台跑起来了!

输入 “ps -ef”,看看!

看到那个 MyDaemon了吧!这次运行的PID是11618,父进程是的PID是1,1是谁?linux init!

4,退出daemon程序:daemon程序不会与控制台输入输出进行交互,所以,用Console.ReadLine之类的方法控制进程的退出是不现实的。那么,怎么关闭这个在后台运行的 daemon呢? 最简办法就是用ps -ef查出这个进程的PID号,然后用kill命令终止它。比如当前运行的这个 mydaemon的PID号是 11618,你只需要输入 kill -9 11618,就能终止它的运行。

原文地址:http://www.cnblogs.com/yunei/p/5352944.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

.NET跨平台实践:用C#开发Linux守护进程相关推荐

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

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

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

    C# Net6开发Linux守护进程(后台服务程序,类似Windows服务)案例 背景 C# net6开发Linux守护进程要点 背景 在使用net6开发Linux程序时,除了AspNet Core项 ...

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

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

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

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

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

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

  6. Linux守护进程实现

    Linux守护进程 redis版: void daemonize(void) {int fd;if (fork() != 0) exit(0); /* parent exits */setsid(); ...

  7. Linux 命令详解(六)Linux 守护进程的启动方法

    Linux 守护进程的启动方法 http://www.ruanyifeng.com/blog/2016/02/linux-daemon.html

  8. 深入理解Linux守护进程

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

  9. Linux守护进程的创建(结合nginx框架)

    Linux守护进程的创建(结合nginx框架) 先介绍几个相关函数: int dup2(arg1,arg2):参数一指向的内容赋给参数二,shi的参数二也能访问参数一所指向的内容,并返回新的描述符 i ...

最新文章

  1. Elasticsearch之Search API
  2. 马斯克39也火星计划PPT
  3. 淘气的页数 - 格式化字符串
  4. python3 分割函数 partition rpartition 函数
  5. 【Android 安全】DEX 加密 ( Application 替换 | 分析 Activity 组件中获取的 Application | ActivityThread | LoadedApk )
  6. python filter
  7. ML之FE:利用【数据分析+数据处理】算法对国内某平台上海2020年6月份房价数据集【12+1】进行特征工程处理(史上最完整,建议收藏)
  8. SQLAlchemy中模糊查询;JS中POST带参数跳转;JS获取url参数
  9. 用户模式 内核模式 linux,linux – “内核模式”和“用户模式”硬件...
  10. [转]上海五年的奋斗历程 从月薪3500到700万(感人!催人振奋!)
  11. 高效管理CrossOver容器里的程序
  12. Argparse 使用
  13. 【带权并查集详解】以HDU 3038为例【How Many Answers Are Wrong】
  14. ZK 数据传输四:BackingBean获取spring层类再获取数据(jsp页面或zul页面)
  15. 个人总结 超详细 windows10下载与安装
  16. STM32——串口通信原理
  17. 陕西西安职高计算机学校有哪些,2019西安中职学校名单(含公办与民办名单)...
  18. 今天14:00 | NeurIPS 专场四 青年科学家专场
  19. 2,词根 - 抓、拿
  20. python画树林_在Python 3中使用深度森林(Deep Forest)进行分类

热门文章

  1. getopt()简介
  2. 2010.7.27 OnDraw与OnPaint有什么区别
  3. 【C#/.NET】不用AutoMapper,我用啥呢?
  4. 这是Blazor上传文件的最佳方式吗?
  5. 上几个WebAPI就算微服务架构?Too Young!
  6. 如何在 C#9 中使用顶级程序 (top-level)
  7. 2020.NET开发者大会大会线上同步直播,以及参会秘籍
  8. 如何在 C# 中使用 Attribute
  9. 在.NET Core中使用MongoDB明细教程(3):Skip, Sort, Limit, Projections
  10. X-lab 开放实验室开源创新的故事