.NET跨平台实践:用C#开发Linux守护进程 不装mono,你的.NET程序照样能够在Linux上运行!

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

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

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

一,建立Daemon程序:app

用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。post

二,部署和运行:url

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

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

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

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,就能终止它的运行。

(本文为宇内流云原创,经查,暂没发现网上有相似的技术文章,欢迎转载)

相关文章
相关标签/搜索