Friday 14 July 2017

Waitforexit Absturz


Ich habe einen Service, der manchmal eine Batchdatei ruft. Die Batch-Datei dauert 5-10 Sekunden zum Ausführen: Die Datei existiert und der Code funktioniert, wenn ich denselben Code in-Konsole ausführe. Doch wenn es in den Service läuft, legt es bei WaitForExit () auf. Ich muss die Batch-Datei aus dem Prozess töten, um fortzufahren. (Ich bin mir sicher, dass die Datei existiert, wie ich es in der Prozessliste sehen kann.) Wie kann ich diese Hang-up Update 1: Kevins Code erlaubt mir, um Ausgabe zu bekommen. Einer meiner Batch-Dateien hängt immer noch. C: EnterpriseDBPostgres8.3binpgdump. exe - i - h localhost - p 5432 - U postgres - F p - a - D - v - fc: backupcasecocherbackupdateevent2008.sql - t public. dateevent DbTest Die andere Batchdatei lautet: C: EnterpriseDBPostgres8.3binvacuumdb. exe - U postgres - d DbTest Ich habe den Weg überprüft und der Postgresql Pfad ist in Ordnung. Das Ausgabeverzeichnis existiert und funktioniert immer noch außerhalb des Dienstes. Irgendwelche Ideen Update 2: Statt des Pfades der Batch-Datei habe ich die C: EnterpriseDBPostgres8.3binpgdump. exe für den proc. StartInfo. FileName geschrieben und alle Parameter zu proc. StartInfo. Arguments hinzugefügt. Die Ergebnisse sind unverändert, aber ich sehe die pgdump. exe im Prozessfenster. Auch dies geschieht nur im Dienst. Update 3: Ich habe den Service mit einem Benutzer in der Administrator-Gruppe ausgeführt, ohne Erfolg. Ich habe null für die Dienste Benutzername und Passwort aktualisiert Update 4: Ich habe einen einfachen Dienst erstellt, um eine Trace in das Ereignisprotokoll zu schreiben und eine Batchdatei auszuführen, die dir darin enthält. Es hängt jetzt bei proc. Start () - Ich habe versucht, das Konto von LocalSystem zu User zu ändern und ich habe den Administrator Benutzer und Passwort, noch nichts. Verwenden von System using System. Collections. Generic using System. Linq using System. Text using System. Diagnostics namespace VG string targetDir string. Format (D: adapterssetup) Hier liegt mybatch. bat proc new Process () proc. StartInfo. WorkingDirectory targetDir Proc. StartInfo. FileName mybatch. bat proc. StartInfo. Argumente string. Format (10) Dies ist Argument proc. StartInfo. CreateNoWindow false proc. Start () proc. WaitForExit () catch (Ausnahme ex),, ex. Message, ex. StackTrace. ToString ()) beantwortet Jan 7 10 at 9:47 Was ist die Batch-Datei zu tun Sind Sie sicher, dass der Prozess wird mit genügend Privaten gestartet, um die Batch-Datei ausführen können können begrenzt werden, was sie tun dürfen. Stellen Sie auch sicher, wenn Sie etwas wie usin den Kopierbefehl tun, um eine Datei zu überschreiben, die Sie so etwas machen: Stellen Sie außerdem sicher, dass Sie vollständige Pfade für die Batch-Befehle verwenden usw. Wenn die Batchdatei eine GUI-App in einigen ausführt Art der Konsolen-Modus, das kann auch ein Problem sein. Denken Sie daran, Dienste haben keinen Desktop (es sei denn, Sie aktivieren die Interaktion mit Desktop), um jede Art von Windows oder Meldungsfelder zu zeichnen. In deinem Programm kannst du vielleicht die Stdout - und Stderr-Pipes öffnen und von ihnen während der Ausführung lesen, falls du irgendwelche Fehlermeldungen oder irgendetwas bekommst. WebServices werden wahrscheinlich als das IUSR-Konto oder das anonyme Konto ausgeführt, das jemals, so dass ein Problem für Sie sein könnte. Wenn es funktioniert, wenn man es in der Konsole ausführt, das ist nur der erste Schritt. ) Ich erinnere mich nicht, wenn System. Diagnostics. Sind nur im Debug oder nicht verfügbar. Wahrscheinlich nicht, aber einige von ihnen könnten sein. Ich muss das mal auf dich aufpassen. Hoffe, das gibt dir einige Ideen. Antwortete am 11.11.2008 um 21:58 pgdump. exe wird wahrscheinlich für die Benutzereingabe aufgefordert. Ist diese Datenbank verlangen Authentifizierung Sind Sie auf alle UMWELT-Variablen, die nicht für den Dienst, den ich nicht wissen, pgdump, aber was sind die anderen möglichen Gründe, die es für Eingabe beantwortet werden würde 12.12 08 um 15:10 Ich kann diesen Befehl aus dem Befehlszeile von cmd. exe und es funktioniert ohne Aufforderung. Ndash Patrick Desjardins Dec 12 08 at 15:25 Der nächste Schritt, den ich nehmen würde, ist, den Debugger zu feuern und zu sehen, ob du sagen kannst, worauf das Programm wartet. Wenn du beim Debugging in der Versammlung ausgetauscht bist, kannst du vielleicht eine IDEA von dem bekommen, was mit Tools wie ProcExp, FileMon, etc. geschieht. Ein Windows-SERVICE und kein Web-Service, macht einen kleinen Unterschied. Wie auch immer, hast du meinen Vorschlag gemacht, den Allow Service einzustellen, um mit dem Desktop zu interagieren Wenn du verzweifelt bist, kannst du versuchen, cmd. exe anstelle deiner Batchdatei zu starten. Dann, mit den cmd. exes cmd Linie Parameter, können Sie IT starten Sie die Batch-Datei. Dies würde Ihnen wahrscheinlich ein cmd-Eingabeaufforderungsfenster geben, um die tatsächliche Ausgabe anzuzeigen, wenn Sie die Interaktion mit dem Desktop einschalten. Für komplette Hilfe auf cmd. exe, geben Sie einfach cmd an jeder Eingabeaufforderung. Elina: Danke für Ihre Antwort. Es gibt einige Notizen am unteren Rand dieses MSDN-Dokuments (msdn. microsoften-uslibraryhellip), die über potenzielle Deadlocks warnen, wenn Sie bis zum Ende der beiden umgeleiteten Stdout - und Stderr-Ströme synchron lesen. Es ist schwer zu sagen, ob Ihre Lösung anfällig für dieses Problem ist. Außerdem scheint es, dass du die process39 stdoutstderr Ausgabe direkt als Eingang sendest. Warum. ) Ndash Matthew Piatt Sep 26 16 at 4:42 Dies ist eine modernere, aufwartende, Task Parallel Library (TPL) basierte Lösung für 4.5 und höher. Usage Beispiel Implementierung beantwortet 5. Oktober 16 um 10:54 Ich Ding, dass dies ist einfach und besser Ansatz (wir brauchen nicht AutoResetEvent) Antwort # 2 am: Mai 18, 2010, 07:13:13 am »True, aber shouldn39t Sie tun. FileName Pfad quotggsci. exequot quot lt Obeycommand. txtquot, um Ihren Code zu vereinfachen oder vielleicht etwas gleichbedeutend mit quotecho Befehl path quotggsci. exequot wenn Sie wirklich don39t wollen eine separate obeycommand. txt Datei verwenden. Ndash Amit Naidu Jun 3 13 at 22:03 Deine Lösung braucht nicht AutoResetEvent, aber du zählst. Wenn du anstelle von Event-Event (wenn sie verfügbar sind), dann sind Sie mit CPU ohne Grund und das deuten darauf hin, dass Sie ein schlechter Programmierer sind. Ihre Lösung ist wirklich schlecht, wenn mit dem anderen mit AutoResetEvent verglichen. (Aber ich habe dir nicht gegeben, weil du versucht hast zu helfen). Ndash Eric Ouellet Nov 7 14 at 18:38 Ich hatte das gleiche Problem, aber der Grund war anders. Es würde aber unter Windows 8 passieren, aber nicht unter Windows 7. Die folgende Zeile scheint das Problem verursacht zu haben. Die Lösung bestand darin, UseShellExecute NICHT zu deaktivieren. Ich habe jetzt ein Shell Popup-Fenster, das ist unerwünscht, aber viel besser als das Programm wartet auf nichts Besonderes passieren. So fügte ich das folgende Work-around hinzu: Jetzt das einzige, was mich stört, ist, warum dies geschieht unter Windows 8 an erster Stelle. Antwortete 13. Januar 15 um 10:35 Ich habe versucht, eine Klasse, die Ihr Problem mit asynchronen Stream zu lösen, zu lesen, indem Sie in Rechnung Mark Byers, Rob, stevejay Antworten zu machen. So erkannte ich, dass es einen Fehler gibt, der mit dem asynchronen Prozessausgangsstrom verknüpft ist. Du kannst das nicht tun: Du erhältst System. InvalidOperationException. StandardOut wurde nicht umgeleitet oder der Prozess hat noch nicht begonnen. Dann müssen Sie die asynchrone Ausgabe starten, nachdem der Prozess gestartet wurde: So machen Sie eine Racebedingung, da der Ausgabestream Daten empfangen kann, bevor Sie ihn auf asynchron einstellen: Dann könnten einige Leute sagen, dass Sie nur den Stream vor Ihnen lesen müssen Setze es asynchron an. Aber das gleiche Problem tritt auf. Es wird eine Race-Bedingung zwischen dem synchronen Lesen und setzen den Stream in den asynchronen Modus. Es gibt keinen Weg, um sicheres asynchrones Lesen eines Ausgabestreams eines Prozesses in der tatsächlichen Weise zu bewirken, dass Process und ProcessStartInfo entworfen wurden. Sie sind wahrscheinlich besser mit asynchronen lesen wie vorgeschlagen von anderen Benutzern für Ihren Fall. Aber Sie sollten sich bewusst sein, dass Sie aufgrund der Rennbedingung einige Informationen verpassen könnten.

No comments:

Post a Comment