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


    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="args"></param>
            static void DaemonMain(string[] args)
            {
                //你的工作代码...
                //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是27979,父进程是的PID是1,1是谁?linux init

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

    转:http://www.cnblogs.com/yunei/p/5352944.html

  • 相关阅读:
    React生命周期
    React第三次入门
    滴滴新锐面经
    前端优化
    Z-index
    maven建ssh项目的pom文件
    拦截器与过滤器的区别
    Jquery的ajax获取action中的返回值
    清空数据库所有表的数据
    orcal操作锦集
  • 原文地址:https://www.cnblogs.com/qiyebao/p/5362144.html
Copyright © 2020-2023  润新知