| 

.NET C# Java Javascript Exception

3
Ich habe ein kleines Problem und würde gerne wissen, wie man die Sache angehen kann.

Wir haben einen Windows-Dienst, der in der Lage ist, verschiedene Batch-Scripts in einem Admin-Konto-Kontext zu starten. Diese Scripts werden dazu genutzt, die Software auf einem aktuellen Stand zu halten. Dazu ruft der batch die Setup-Routinen im Silent-Modus auf.

Meistens geht auch alles gut - nur nicht dann, wenn, wie auch immer, trotzdem eine Benutzereingabe verlangt wird ("Sollen die Einstellungen auch gelöscht werden?" - oä.). Dann geht nix weiter.

Manchmal bekommen wir das erst mit, wenn der Nutzer sagt, dass eine ihm zugeteilte Software "nicht ankommt". Dann stellen wir fest, dass die CMD.EXE offen ist und z.B. AIMP_INSTALLER.EXE. Wenn ich dann die AIMP_INSTALLER.EXE abbreche, geht der Batch weiter und installiert den Rest.

Frage: Wie kann man feststellen, ob ein Prozess noch "arbeitet" oder ob er "auf was wartet". Die Lösung mit "wir warten einfach 10 Minuten - dann sollte es fertig sein und wir killen den Prozess" klingt mir da nicht so sauber. Was, wenn durch Netzwerk/CPU Auslastung die Installation nun 15 Minuten dauert?

Wie gesagt, wir bräuchten da mal eine Idee, wie man so was sinnvoll überwachen kann.
14.05.2012
MyKey0815 1,6k 2 9
Sollte ein Silent-Modus nicht.. silent sein? ;-) Kann man dann nicht die entsprechenden Abfragen einfach unterdrücken und Default-Werte vorgeben.
puls200 14.05.2012
3 Antworten
1
Ich behaupte: kannst Du nicht feststellen.
Beispiel: Wenn der Installer nicht sauber prograimmiert wurde in einer Endlosschleife hängt - ist das jetzt ein gewolltes Verhalten?
Auf Dein Beispiel zurück zu kommen: Du kannst doch feststellen dass das Fenster "Wollen Sie.." geöffnet wurde und darauf reagieren. Ist auch nicht sauber, aber wenn der Installer sauber wäre, würde er im Silent auch durchlaufen.

Edit:
Noch ein Tipp
Schau Dir AutoIT Script, damit kannst Du Abläufe relativ einfach automatisieren. Habe damit selber schon eine Softwareverteilung realisiert.
14.05.2012
Jaksa 4,0k 1 8
Jaksa 4,0k 1 8
1
Edit 20120526

OK, deinem Kommentar nach zu urteilen hab ich mich wohl zu kompliziert ausgedrückt, jetzt klarer:

Möglichkeit 1 (die einzig vernünftige): installer sauberer programmieren, statt unerwünschter Benutzerfragen Abbruch und Log / E-Mail.

Wenn das nicht gewünscht oder nicht umsetzbar ist, gibt es unter Windows begrenzte Möglichkeiten mit cmd.exe,

2: Tasks wenigstens voneinander zu isolieren, damit wenigstens andere durchlaufen, wenn einer hängt (start),
3: im Fall, dass wenigstens ein Abbruch und eine errorlevel-Übergabe durch das Programm möglich ist, diesen errorlevel und / oder einen Fehlerlog zu loggen und zu mailen (blat),
4: nach 10 oder 20 min herauszukriegen, ob eine Anwendung "hängt", statt vielleicht nie oder erst nach einer ungewissen Benutzermeldung, und darüber das technische Personal zu verständigen, so dass gezielter und nur der Job abgebrochen oder beantwortet oder was immer werden kann (tasklist, find, blat),
5: durch eine Kombination von möglichst viel von 1 bis 4 ein besseres Benutzersetuperlebnis hinzukriegen.

Wenn das gelingt, geht es nach meinem logischen Verständnis über "10 min Warten und Task killen" hinaus.

Ich hab die Ausgangsfrage und ihre Details gerade noch einmal gründlich gelesen und behaupte, sagen zu können, meine Antwort antwortet auf deine Frage. Wenn dir meine Antwort nicht hilft, formulier die Frage genauer.

6 (neu): Es kann sein, dass auch ein Redirect (>) oder Pipen (|) der Befehlszeilenausgabe des installers dir weiterhilft, zu erkennen, dass ein Prompt dein Programm blockiert.

Ziemlich sicher gibt es mächtigere Werkzeuge als cmd, derartige Situationen zu meistern, AutoIt wurde genannt, evtl. PowerShell, evtl. VBScript, evtl. auch eine richtige Programmiersprache. Ein richtiger skriptbarer Installer wie NSIS ist wahrscheinlich das Beste, vor allem, wenn Abhängigkeiten zu beachten sind (geht aber aus deinem Beispiel nicht hervor).

Alles das ist Theorie, solang die Aufgabenstellung so unklar bleibt, wie sie hier schon zu Anfang war.


Original-Antwort:

Ich würde die jeweiligen installer im silent-Modus wirklich silent arbeiten und auch abbrechen lassen. Die Fehler- oder Abbruchbedingung sollte sich in einem Log niederschlagen. Wenn ihr die installer nicht selbst programmiert, müsst ihr wohl mit errorlevel arbeiten. Lasst euch mit einer Befehlszeilen-E-Mail per http://www.blat.net/ informieren, wenn etwas nicht glatt gelaufen ist.

Wenn die setups das nicht hergeben und auch nicht dahin manipulierbar sind, würde ich die installer am besten einzeln per Scheduled Task aufrufen. Da gibt es einige Optionen zu Abbruch oder Wiederholung im Fehlerfall, auch einen Timeout, wenn irresponsiv.

Das Nebeneinander oder Aufeinanderwarten von Prozessen kannst du in Batches mit dem Befehl start steuern. Vielleicht ist das ja schon die Lösung, dass ein installer nicht alle anderen aufhalten kann, weil sie unabhängig voneinander gestartet werden, ggf. zeitversetzt mit at. Da du aber beschreibst, dass du einen installer schlicht abbrichst, wird das gar nicht nötig sein.

Und schließlich gibt es ja nicht nur taskkill, sondern auch tasklist und find, mit sowas wie
tasklist | find "AIMP_INSTALLER.EXE"
if errorlevel 0 blat ...


kannst du 20 oder 30 min nach Start feststellen, ob einer der parallel laufenden Prozesse noch läuft, und dir eine E-Mail schicken. Der abgefragte errorlevel ist übrigens der von find. (Auf meiner Maschine hier gibt er bei Nicht-Gefunden gar keinen errorlevel, sonst würde das wie oben nicht funktionieren, denn if errorlevel 0 ist immer zu lesen als if errorlevel >= 0, da müsstest du größere Verrenkungen machen, um rauszukriegen, ob errorlevel = 0 ist. Immer von oben nach unten abfragen ...)

Genaueres kann es erst geben, wenn von dir Genaueres kommt.
14.05.2012
mupan 575 1 8
mupan 575 1 8
Danke für deine Erklärungen. Also läuft es letztendlich wieder auf das "wir warten einfach 10 Minuten - dann sollte es fertig sein und wir killen den Prozess" hinuas.

Meine Frage ging eher ob es eine alternative Vorgehensweise gibt. Aber anscheinend wohl nicht.
MyKey0815 16.05.2012
0
Natürlich ist ein "Silent-Modus" silent ;-) - Aber manche Sachen treten im Silent-Modus trotzdem auf - oft im Zusammenhang mit einer vorherigen Installation. Und je nachdem - ein paar Sachen lassen sich nicht völlig Silent machen - leider
14.05.2012
MyKey0815 1,6k 2 9

Stelle deine Batch-Frage jetzt!