2013-03-12 112 views
0

我似乎無法找到一種方式讓C#服務在debian中作爲「服務」運行。 我在做什麼錯?C#服務作爲Debian中的單服務守護進程

我跟着這個帖子從MSDN創建一個樣本窗口服務:http://msdn.microsoft.com/en-us/library/zt39148a(v=vs.80).aspx

我可以在我的Windows機器上運行的服務,啓動和停止服務,並看到它寫入MyNewLog。

然後,我把它複製(.exe文件)到我的Debian系統,並嘗試與運行(作爲root)單服務MyNewService.exe

系統日誌告訴是我該服務已經開始!

我沒有錯誤,我無法在系統中看到任何新創建的日誌文件。我究竟做錯了什麼?

如果有幫助,這裏是代碼: Program.cs中

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.ServiceProcess; 
using System.Text; 

namespace MyNewService 
{ 
static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    static void Main() 
    { 
     System.ServiceProcess.ServiceBase[] ServicesToRun; 
     ServicesToRun = new System.ServiceProcess.ServiceBase[] 
     { 
      new MyNewService() 
     }; 
     System.ServiceProcess.ServiceBase.Run(ServicesToRun); 
    } 
} 
} 

Service.cs

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Diagnostics; 
using System.Linq; 
using System.ServiceProcess; 
using System.Text; 

namespace MyNewService 
{ 
public partial class MyNewService : ServiceBase 
{ 
    public MyNewService() 
    { 
     InitializeComponent(); 
     if (!System.Diagnostics.EventLog.SourceExists("MySource")) 
     { 
      System.Diagnostics.EventLog.CreateEventSource(
       "MySource", "MyNewLog"); 
     } 
     myEventLog.Source = "MySource"; 
     myEventLog.Log = "MyNewLog"; 
    } 

    protected override void OnStart(string[] args) 
    { 
     myEventLog.WriteEntry("Service Started: OnStart"); 
    } 

    protected override void OnStop() 
    { 
     myEventLog.WriteEntry("Service Halted: OnStop."); 
    } 
} 
} 

/乾杯

+0

pleaee顯示一些源代碼...因爲你的服務在debian上開始,似乎主要問題是缺少日誌? – Yahia 2013-03-12 10:52:47

回答

5

嘗試登錄其他地方比System.Diagnostics程序。 EventLog,可能是文本文件或類似的文件。

我最近找不到任何東西,但是這個post表明EventLog在Linux上運行時會被丟棄;這是有道理的。

編輯:

調查單聲道源似乎承擔了這一點。事件記錄有三種可能的選項:win32,local和null。如果MONO_EVENTLOG_TYPE環境變量設置爲local,那麼在Linux上,日誌應該默認寫入/ var/lib/mono/eventlog。

您確實需要將您的日誌代碼與期望隔離 - 看起來您的服務正常運行,但日誌記錄是問題。

+0

謝謝,我糾正!我創建了一個單獨的文件來登錄。它的工作。現在我遇到了停止服務的問題。在PID上運行了一個。當它開始時它被創建並且被停止刪除。但它自己的服務不起作用。當刪除鎖,服務工作,但我不能停止沒有「ps -efH」,然後殺死PID ....服務MyApp停止不會這樣做! – Christian 2013-03-13 12:40:03

+0

@Christian可能更好地補充說,作爲一個新的問題:) – TheNextman 2013-03-13 14:35:00

+0

可能,thanx! – Christian 2013-03-14 18:29:34

0

組環境MONO_EVENTLOG_TYPE https://man.cx/mono(1)

/lib/systemd/system/order-log-writer.service

[Service] 
Environment=MONO_EVENTLOG_TYPE=local:/var/lib/mono/eventlog 
User=root 
Group=root 
Type=forking 
PIDFile=/run/order-log-writer.pid 
ExecStart=/usr/bin/mono-service -l:/run/order-log-writer.pid /usr/bin/rmq-bot/order-log-writer.exe 
ExecStop=/bin/kill -HUP $MAINPID 

C#

try 
{ } 
catch (Exception e) 
{ 
    EventLog.WriteEntry(this.GetType().FullName, " error[.] " + e.Message); 
} 

的Linux

[email protected]:/var/lib/mono/eventlog/Application$ ls 
1.log 2.log 3.log Application EDAClasses.OrderLogWriterClass 
[email protected]:/var/lib/mono/eventlog/Application$ cat 1.log 
InstanceID: 0 
EntryType: 4 
Source: EDAClasses.OrderLogWriterClass 
Category: 0 
TimeGenerated: 20170926140803456 
ReplacementStrings: 1 
error[.] Error converting value 1 to type 'OrderLog'. Path '', line 1, position 1. 
相關問題