Zum Inhalt springen

Dienst tut nicht, was er soll


Luze

Empfohlene Beiträge

Hallo alle miteinander,

ich habe mal wieder ein problem.

Und zwar tut ein von mir programmierter Dienst nicht 100% das, was er soll.

Ein kleiner Bestandteil ist es, dass er ein Arbeitsprotokoll in einer Textdatei mitschreibt und dieses in regelmäßigen Abständen per Mail an mich schickt.

Nun ist es aber das problem, dass der Dienst keinerlei Anstalten macht auch nur ansatzweise etwas zu schreiben. Kann es sein, dass man bei Diensten bei Dateizugriffen Besonderheiten beachten muss?

Lg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Startet der Dienst auch sauber?

Der Dienst darf für die Abarbeitung der Startrutine nicht länger 30 Sekunden benötigen sonst gilt der Dienststart als Fehlgeschlagen und dieser wird beendet.

Über Windows Dienst-Anwendungen

Wenn OnStart länger als 30 Sekunden braucht, bricht der Service Control Manager (SCM) den Start ab und schreibt eine Fehlermeldung in das Ereignisprotokoll. Alles, was länger dauert, muss in einem eigenen Thread laufen, der von OnStart gestartet wird. Für sich wiederholende Operationen können Sie das Timer-Steuerelement verwenden.

Lg

Gateway

Link zu diesem Kommentar
Auf anderen Seiten teilen

hast du mit Exception Handling gearbeitet?

Wenn ja, nimm die Try-Catch Handler mal raus (oder prepariere den catch block dementsprechend so, das er eine MessageBox mit dem Fehlertext anzeigt), deinstalliere den Dienst und installiere in mal neu.

Wenn der Dienst wirklich kein Zugriff auf den Pfad hat, wirft er definitiv einen Fehler.

Diesen kannst du dann diagnostizieren, beziehungsweise hier reinstellen.

lg

Gateway

PS:

Es wäre natürlich auch hilfreich, wenn du deine OnStart Prozedure mal posten würdest....

Bearbeitet von Gateway_man
Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn ja, nimm die Try-Catch Handler mal raus (oder prepariere den catch block dementsprechend so, das er eine MessageBox mit dem Fehlertext anzeigt)

Das bewirkt bestenfalls, dass der Dienst hängt. Dienste können und sollen nicht direkt mit dem Benutzer interagieren, die Messagebox würde niemand sehen.

Luze, häng dich mit dem Debugger dran:

How to: Debug Windows Service Applications

Link zu diesem Kommentar
Auf anderen Seiten teilen

Bist du dir da sicher?

Ich bin mir ziemlich sicher das ich bereits MessageBoxen bei Dienstanwendungen erfolgreich integriert hatte.

Naja er muss es ja auch nicht zwingen in ne messagebox für die Ausgabe nutzen.

Dann soll er sich eben alles in eine logfile schreiben lassen, oder soll direkt einen Eintrag mit der Fehlermeldung per EventLog in die Ereignissanzeige reinschreiben.

lg

Gateway

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich bin mir ziemlich sicher das ich bereits MessageBoxen bei Dienstanwendungen erfolgreich integriert hatte.
Dienste haben eine eigene Window Station und damit einen eigenen Desktop. Sie müssen ja auch funktionieren können, wenn kein Benutzer angemeldet ist.

Es gibt (aber auch nur bis Windows XP) die Möglichkeit, einen Dienst mit dem Desktop eines Benutzers interagieren zu lassen, aber das ist ein Sicherheitsproblem.

Siehe http://en.wikipedia.org/wiki/Shatter_attack

Dann soll er sich eben alles in eine logfile schreiben lassen,

Das ist ja genau das, was nicht funktioniert ;)
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

ich würde den Dienst ganz einfach debuggen... :D

Da sich ein Dienst nicht mittels F5 starten lässt muss man die Dienstanwendung "Neu erstellen" und zwar im Debug-Modus (Release kopiert die .pdb-Datei nicht mit). Anschließend wird der Dienst installiert (Setup basteln oder installutil.exe nutzen) und gestartet.

Wenn man das entsprechende Projekt nun im Studio noch geöffnet hat kann man sich hier an einen Prozess anhängen (Extras-->An Prozess anhängen).

Hier muss dararauf geachtet werden dass alle Prozesse aller Benutzer angezeigt werden (Checkboxen im unteren Bereich der Prozessauflistung).

Dann wird der entsprechende Dienst aus der Liste ausgewählt, noch ein klick auf "Anfügen" und fertig. Jetzt kann man im Quellcode wie gewohnt Haltepunkte an gewünschte Stellen setzen und der Prozess wird dort anhalten. Und man kann mit F10 Schritt für Schritt durch den Code wandern.

So sollte man den Fehler recht schell finden können.

Viele Grüße,

Thomas

Link zu diesem Kommentar
Auf anderen Seiten teilen

so hallo,

ich habe jetzt schon einige Szenarien durchgespielt, andere Konten, debuggen etc.

Mir ist beim debuggen aufgefallen, dass scheinbar das enthaltene Timer event nie ausgelöst wird.

Ich erkläre mal so, in der OnStart() Methode wird ein Timer aktiviert und gestartet, aber auch ein Hintergrundthread, der TCP connections checkt, normalerweise sollte der Hintergrundthread doch das Timer Event nicht beeinflussen oder etwa doch?

ich habe den Threadstart mal rausgenommen uhnd erneut debuggt, und trotzdem tritt das Event Timer_tick nicht auf, und ja ich bin mir sicher, dass der Timer gestartet wird

Link zu diesem Kommentar
Auf anderen Seiten teilen

also da Dienste kein GUI besitzen, hat meiner natürlicha auch keins, das Grundgerüst ist von Visual Studio Pro 2008 entworfen worden.

Das mit den Timern ist interessant, möglich, dass es daran liegt, ich werds mal testen

Edit: Die Vermutung, die ich schonmal hatte hat sich bestätigt, das Timer Event wurde nie ausgelöst, allerdings weil Objektverweis wurde nicht auf eine Objektinstanz gelegt....

Bearbeitet von Luze
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

ja der Timer von Windows wird so nicht greifen.

Ich habe hier mal etwas funktionsfähigen Code:


    public partial class WriteService : ServiceBase

    {

        System.Timers.Timer tim = new System.Timers.Timer(10000);

        public WriteService()

        {

            InitializeComponent();

        }


        protected override void OnStart(string[] args)

        {

            tim.Enabled = true;

            tim.Elapsed += new System.Timers.ElapsedEventHandler(tim_Elapsed);

            using(StreamWriter sw = new StreamWriter(@"c:\AAALog.txt", true))

            {

                sw.WriteLine("Service has started at " + DateTime.Now.ToLongTimeString());

                sw.Close();

            }

        }


        void  tim_Elapsed(object sender, System.Timers.ElapsedEventArgs e)

        {

 	            using(StreamWriter sw = new StreamWriter(@"c:\AAALog.txt", true))

            {

                sw.WriteLine("Service is running " + DateTime.Now.ToLongTimeString());

                sw.Close();

            }

        }


        protected override void OnStop()

        {

            using(StreamWriter sw = new StreamWriter(@"c:\AAALog.txt", true))

            {

                sw.WriteLine("Service has stopped at " + DateTime.Now.ToLongTimeString());

                sw.Close();

            }

        }

    }

Der Service schreibt in eine datei wenn er startet, beendet wird und zwischendurch (Timer) alle 10 Sekunden.

Viele Grüße,

Thomas

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...