.NET跨平臺實踐:用C#開發Linux守護進程

来源:http://www.cnblogs.com/yunei/archive/2016/04/04/5352944.html
-Advertisement-
Play Games

Linux守護進程(Daemon)是Linux的後臺服務進程,它脫離了與控制終端的關聯,直接由Linux init進程管理其生命周期,即使你關閉了控制台,daemon也能在後臺正常工作。 一句話,為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="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,就能終止它的運行。

(本文為宇內流雲原創,經查,暫沒發現網上有類似的技術文章,歡迎轉載,但請註明作者名號)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • js面向對象的組成是 1、屬性 2、方法 使用的時候是再構造函數裡面加屬性,在原型裡面加方法。 如果直接在構造函數裡面:傳值、新建對象、增加屬性/方法、返回對象的這種方法,會產生問題,主要是 1、沒有new 2、函數重覆定義,這樣會讓資源浪費 所以,我們要在構造函數裡面使用this構造屬性,把方法放 ...
  • jquery現在的事件API:on,off,trigger支持帶命名空間的事件,當事件有了命名空間,就可以有效地管理同一事件的不同監聽器,在定義組件的時候,能夠避免同一元素應用到不同組件時,同一事件類型之間的影響,還能控制一些意外的事件冒泡。在實際工作中,相信大家都用的很多,但是不一定瞭解它的所有細 ...
  • 軟體測試作為程式員必備的一項技能是決定軟體開發周期長短以及軟體運行成敗的關鍵,可以說好的軟體不是代碼寫得好而是有效的測試決定的。本文將介紹在android下利用eclipse進行開發時如何使用JUnit進行單元測試。 一、測試的分類(僅舉例其中一些方法) 【根據測試是否知道代碼】 1、黑盒測試(測試 ...
  • Http基礎 這篇文章是講 網路請求的先導文章,主要講 工作流程,請求報文和響應報文的格式,以及 和`POST`方法的具體含義。 Http工作流程 是一個客戶端和伺服器端請求和應答的標準( )。客戶端是終端用戶,伺服器端是網站。通過使用 瀏覽器、網路爬蟲或者其它的工具,客戶端發起一個到伺服器上指定端 ...
  • 每一個Android應用在啟動的時候都會創建一個線程,這個線程被稱為主線程或者 I線程,Android應用的所有操作預設都會運行在這個線程中。 但是當我們想要進行數據請求,圖片下載,或者其他耗時操作時,是不可能在這個 線程做的,因為Android在3.0以後的版本已經禁止了這件事情,直接拋出一個異常 ...
  • 在Windows下編譯mongo-c-driver 1.3.x 在Windows下編譯mongo-c-driver 1.3.x 1.安裝 MSYS2https://sourceforge.net/projects/msys2/2.如果是32位系統或編譯32位程式,運行 mingw32_shell.b ...
  • 試下把這行改一下2001:raw:600:/dev/ttyS0:9600 NONE 1STOPBIT 8DATABITS XONXOFF LOCAL -RTSCTS 2001:raw:600:/dev/ttyATH0:9600 NONE 1STOPBIT 8DATABITS XONXOFF LOCA ...
  • #This script is to parse data file: fun0() { ##[INFO1]a=1 b=2 c=3[INFO2]a=7 b=8 c=9[INFO3]a=x b=y c=z } #! /bin/bashread Info Abc#echo $Infoif [ "$Inf ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...