Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst Programm wird sehr langsam ausgeführt

Mitglied: Peter32

Peter32 (Level 1) - Jetzt verbinden

07.09.2016 um 13:02 Uhr, 1177 Aufrufe, 19 Kommentare, 1 Danke

Hallo,

ich habe ein kleines Programm gebastelt (mit Anfängerskills!), welches erst überprüft, wieviele Benutzer angemeldet sind und wenn mehr als einer angemeldet ist, dann sollen nicht mehr als 3 Instanzen vom Programm sampleprogram.exe laufen, ansonsten dürfen 5 laufen. Und wenn gerade mehr als 3 laufen und jemand angemeldet ist, sollen die 2 ältesten (am längsten laufenden) davon beendet werden.

Ich weiß, ich habe sehr umständlich die PID eingelesen, aber besser habe ich es noch nicht hinbekommen mit meinen bisherigen Batch-Kenntnissen.

Auf jeden fall dauert dieses ganze skript immer sehr sehr lange und ich brauche etwas Hilfe, um das schneller hinzukriegen.

Hoffe das Prinzip ist klar

Danke im Voraus!

LG
Peter


Mitglied: Kraemer
07.09.2016 um 13:08 Uhr
Moin,

eines deiner Problem ist, das du sehr viel auf Dateien zum zwischenspeichern setzt.
Du schreibst, das du Anfänger bist. Warum setzt du das Ganze dann nicht mit Powershell um und lernst dabei gleich etwas, was man in der Zukunft auch noch brauchen kann und dabei auch noch viel mächtiger ist?

Gruß Krämer
Bitte warten ..
Mitglied: Peter32
07.09.2016 um 14:26 Uhr
Hallo Krämer,

weil ich glaube, dass bevor ich PowerShell lerne, ich besser erstmal Batch verstehen sollte, weil mir das einfacher erscheint.

Gruß
Peter
Bitte warten ..
Mitglied: Kraemer
07.09.2016 um 14:47 Uhr
Zitat von Peter32:
weil mir das einfacher erscheint.

Ich glaube, da liegst du falsch:

Beispiel Powershell für angemeldete Benutzer:
$CurrentUsers ist ein Array der Benutzernamen
Per $CurrentUsers.count kannst du die Anzahl auswerten

Beispiel Powershell für laufende cmd
$proc ist ein Array der PID's

Drum herum noch ein paar Abfragen und fertig das Ganze. Und vor allem: Viel schneller!

Gruß Krämer
Bitte warten ..
Mitglied: Pjordorf
07.09.2016 um 14:48 Uhr
Hallo,

Zitat von Peter32:
Auf jeden fall dauert dieses ganze skript immer sehr sehr lange
Definiere doch mal dein sehr sehr lange. Ich kann mir da nichts drunter Vorstellen.
Hardware ist was?
OS ist was?
Prozesse laufen wie viele im Schnitt / Max?
An welche Stelle soll es denn langsam sein? Dazu mal in ein Log dir die Zeit bei einzelnen stufen notieren (echo %Time%>>%Log%). In Powershell gäbe es das "Measure-Command"

Gruß,
Peter
Bitte warten ..
Mitglied: Peter32
07.09.2016, aktualisiert um 19:14 Uhr
Danke für die Antworten!

@Pjordorf:
Mit sehr sehr lange meine ich ein paar Minuten.
Hardware ist ein Virtueller Server mit Windows 8 und 4 Kernen mit 2,2GHz und 16GB RAM.
Im Schnitt laufen um die 100 Prozesse.
Das mit der Log kann ich mal ausprobieren. Wie genau funktioniert das mit dem "Measure-Command"?

@krämer, du hast geschrieben:

Wenn es scheinbar nicht so aufwändig in PowerShell ist und du dazu Zeit hast, würde ich mich natürlich über eine Demonstration deiner PowerShell Künste sehr freuen

LG
Peter
Bitte warten ..
Mitglied: Pjordorf
07.09.2016 um 19:28 Uhr
Hallo,

Zitat von Peter32:
Das mit der Log kann ich mal ausprobieren. Wie genau funktioniert das mit dem "Measure-Command"?
Powershell und https://technet.microsoft.com/de-de/library/ee176899.aspx
http://ss64.com/ps/measure-command.html

Vielleicht ist ja dein KillPID ein wenig Lahm...sehe keinen wirklichen Grund warum dort Minuten vergehen, ausser dein Virtueller Server mit Windows 8 ..... oder ists der Host..... vielleicht machen deine Platten Sommerurlaub ....

Gruß,
Peter
Bitte warten ..
Mitglied: Biber
08.09.2016, aktualisiert um 09:10 Uhr
Moin Pjordorf,


Zitat von Pjordorf:

Vielleicht ist ja dein KillPID ein wenig Lahm...sehe keinen wirklichen Grund warum dort Minuten vergehen....
ich denke, es ist relativ banal.
Peter32 hat oft Zeilen wie folgende in seinem Code:
if exist "ProcessesToKillCPU.txt" del "ProcessesToKillCPU.txt" /s /q >NUL
.... Folgezeilen: schreib irgendwas neues in die gerade gelöschte Datei.

Sieht zwar umständlich, aber relativ harmlos aus? Genau hinsehen...

Gesehen? Wenn er z.B. im Root-Verzeichnis von C:\ arbeitet..
Dort existiert zufällig eine Datei "ProcessesToKillCPU.txt" ...
Dann wird danach mit del dieseDatei /s /q in allen ver###ten Unterverzeichnissen gelöscht/gesucht.

Klar kann das mal einen Moment dauern.

Grüße
Biber
Bitte warten ..
Mitglied: Friemler
LÖSUNG 08.09.2016, aktualisiert um 10:46 Uhr
Moin zusammen,

ergänzend zu Bibers Kommentar: Das ganze Geraffel unter :KillProcessCPU lässt sich außerdem auf die folgenden Zeilen eindampfen:

@Peter32
Hast Du Dir diesen kruden Codeblock wirklich selbst ausgedacht oder á la Generation Google bloß irgendwelche Schnipsel aus dem Netz ohne darüber nachzudenken zusammenkopiert?

Grüße
Friemler
Bitte warten ..
Mitglied: Pjordorf
08.09.2016 um 12:04 Uhr
Hallo,

Zitat von Biber:
Sieht zwar umständlich, aber relativ harmlos aus? Genau hinsehen...
Stimmt, danke.

Gruß,
Peter
Bitte warten ..
Mitglied: Peter32
08.09.2016 um 14:55 Uhr
Hallo,

Danke für Eure Beiträge!


Zitat von Biber:
Peter32 hat oft Zeilen wie folgende in seinem Code:
if exist "ProcessesToKillCPU.txt" del "ProcessesToKillCPU.txt" /s /q >NUL
.... Folgezeilen: schreib irgendwas neues in die gerade gelöschte Datei.

Sieht zwar umständlich, aber relativ harmlos aus? Genau hinsehen...

Gesehen? Wenn er z.B. im Root-Verzeichnis von C:\ arbeitet..
Dort existiert zufällig eine Datei "ProcessesToKillCPU.txt" ...
Dann wird danach mit del dieseDatei /s /q in allen ver###ten Unterverzeichnissen gelöscht/gesucht.

Gibt es denn eine Möglichkeit CMD zu sagen, es soll nur in diesem einen Verzeichnis suchen? Ich habe übrigens keine Unterordner in jenem Root...


Zitat von Friemler:
ergänzend zu Bibers Kommentar: Das ganze Geraffel unter :KillProcessCPU lässt sich außerdem auf die folgenden Zeilen eindampfen:

@Peter32
Hast Du Dir diesen kruden Codeblock wirklich selbst ausgedacht oder á la Generation Google bloß irgendwelche Schnipsel aus dem Netz ohne darüber nachzudenken zusammenkopiert?

Ich habe vieles zusammenkopiert aber auch selbst überlegt, wie ich an die einzelnen Ziele komme mit meinen bisherigen Batch-Kenntnissen.
Zu deinem Code, der sehr gut funktioniert, wie kann ich da am effizientesten hinzufügen, dass er den loop so lange machen soll, bis sampleprogram.exe z.B. 5 mal noch existiert und erst dann aus dem LoopBreak?
Bitte warten ..
Mitglied: Pjordorf
08.09.2016, aktualisiert um 16:57 Uhr
Hallo,

Zitat von Peter32:
Gibt es denn eine Möglichkeit CMD zu sagen, es soll nur in diesem einen Verzeichnis suchen? Ich habe übrigens keine Unterordner in jenem Root...
Schau dir mal ein "Del /?" an. Da wirst du den Schalter /S erklärt finden. Lasse den einfach weg.

Ich habe vieles zusammenkopiert
Dann sollte man sich die zeit nehmen um diese kopierten Schnipsel auch zu verstehen und vor allem was die tatsächlich tun und notfalls die einzelnen Schalter eines befehls in frage stellen.

Zu deinem Code, der sehr gut funktioniert, wie kann ich da am effizientesten hinzufügen, dass er den loop so lange machen soll, bis sampleprogram.exe z.B. 5 mal noch existiert und erst dann aus dem LoopBreak?
Z.B. so in etwa
Gruß,
Peter

PS. Um primitive Laufzeit ergänzt.
Bitte warten ..
Mitglied: Peter32
08.09.2016 um 16:21 Uhr
Super Danke - das werde ich gleich ausprobieren


Zitat von Pjordorf:

Dann sollte man sich die zeit nehmen um diese kopierten Schnipsel auch zu verstehen und vor allem was die tatsächlich tun und notfalls die einzelnen Schalter eines befehls in frage stellen.


Ja das versuche ich ja auch und werde ja auch langsam Stück für Stück besser, aber ich will ja auch kein Profi werden, sondern es soll nur dem Zweck dienen und auch wenn es nicht perfekt geschrieben ist, solange es funktioniert, bin ich schon zufrieden
Bitte warten ..
Mitglied: Biber
08.09.2016, aktualisiert um 16:41 Uhr
Moin Peter32,

es gibt mehrere Probleme und Folgeprobleme in deinem Batch.
Ein (ungeklärtes) Problem ist die sehr hohe Laufzeit.
Solange dafür die Ursache nicht geklärt ist, brauchen wir nicht allzuviel anders gestalten.
Was ich meine ist, wenn du jetzt in deinem Batch am Anfang ermittelst (und in irgendwelche Hilfsdateien schreibst), wieviele Prozesse XY laufen und welche PIDs die haben, der Batch dann aber 10 Minuten läuft bis du zum Killen der ältesten Prozesse kommst...
-> dann ist u.U. die ursprüngliche Information "von Prozess XY laufen 11 Instanzen mit den und den PIDs" schon längst überholt.
Sind ja jetzt vielleicht nur noch 4 Prozesse, davon 2, die es auch schon vor 10 Minuten gab und 2 neue.
Bedeutet: was du jetzt da ermittelst als Prozessliste oder in %Counter% schreibst, ist nicht oder nur von grossen Optimisten/Fatalisten verwendbar.

Daher wäre die ersten Schritte:
  • ermittle, WO denn im Batch die Zeit verbraten wird. Also ein paar Zeilen der Form
Echo %time% bin jetzt in der For/F-Anweisung in Zeile 23 -- Laufvariable hat den Wert %%a
...in den Code. damit wir sehen, was da Zeit frisst.



Zitat von Peter32:


Gibt es denn eine Möglichkeit CMD zu sagen, es soll nur in diesem einen Verzeichnis suchen?
Ich habe übrigens keine Unterordner in jenem Root...
Wenn du KEINE Unterverzeichnisse in denem Verzeichnis hast, dann werden der DEL /s - nicht sovile Zeit kosten.
Um so wichtiger ist, die Zeitfresser zu lokalisieren.
Zu den unnötigen Zwischenspeicherungen in Dateien.
  • Tipp 1: speichere nicht soviel in Dateien (beispielsweise die tasklist-Ausgaben), sondern nimm diesen Output gleich als Parameter in den FOR/F-Anweisungen. Siehe Friemlers Beispiel.
  • Tipp 2: Wenn du eine Datei erzeugst, dann immer in einem bestimmten Pfad, und wenn es eine temporäre Datei ist, dann drängt sich als Ordner der %temp%-Ordner auf
  • Tipp 3: Wenn es doch eine temporäre Datei ist, dann sollst du nicht erst gucken, ob so eine vorhanden ist und die dann löschen, sondern hinterher, nach dem eigentlichen Tageswerk deines Bätsches, aufräumen und diese Trümmer löschen.
  • Tipp 4: EINE bestimmte Datei in einem Ordner kannst du mit DEL ohne Parameter /s /q löschen
Also statt bisher:
... besser vom Stil her:

Deine Frage:
..., wie kann ich da am effizientesten hinzufügen, dass er den loop so lange machen soll, bis sampleprogram.exe z.B. 5 mal noch existiert und erst dann aus dem LoopBreak?
-> vertagen, bis geklärt ist, was da > 10 Minuten dauert. Denn einen 10 Minuten alten %counter% können wir nicht als "skip=.."-Parameter verwenden.

Grüße
Biber
Bitte warten ..
Mitglied: Pjordorf
08.09.2016 um 16:34 Uhr
Hallo,

Zitat von Peter32:
solange es funktioniert, bin ich schon zufrieden
Dann hau mit einen 12 Kilo Vorschlaghammer auf dein PC ein. Funktioniert auch irgendwie. Aber solange du ja anderer Leuts Zeit und Wissen nutzt ists ja gut...

Gruß,
Peter
Bitte warten ..
Mitglied: Biber
08.09.2016 um 16:48 Uhr
Moin Pjordorf,

sorry, eben haben wir parallel gepostet.
Deshalb noch als Anmerkung zu deiner Zeile 16
for /f "tokens=2" %%a in ('tasklist ^| findstr /i /b /c:"sampleprogram.exe"') do ( ..

Wenn du die noch sortierst nach PIDs...
for /f "tokens=2" %%a in ('tasklist ^| findstr /i /b /c:"sampleprogram.exe" ^|sort') do ( ...
-> dann kommen die kleinsten PIDs zuerst - also toi toi toi die ältesten, die ja zuerst gekillt werden sollen.

Ich hätte halt umgekehrt sortiert
for /f "tokens=2" %%a in ('tasklist ^| findstr /i /b /c:"sampleprogram.exe" ^|sort /reverse') do ( ...
... und noch einen skip-Parameter eingebaut mit dem Wert =%counter%-3

Grüße
Biber
Bitte warten ..
Mitglied: Friemler
08.09.2016, aktualisiert um 18:29 Uhr
Hallo Biber,

da muss ich jetzt wohl mal in die Bresche springen, die kritisierte Zeile stammt ja schließlich von mir.

Die von Dir angesprochene Befürchtung nach dem Alter der Prozesse kam mir schon, als ich den Code von Peter32 nachvollzogen habe (dort ist der Teil innerhalb der FOR-Klammer bereits enthalten). Meine Tests haben jedoch ergeben, dass der TASKLIST-Befehl implizit (und undokumentiert) wohl tatsächlich die Prozesse nach ihrem Alter sortiert anzeigt (älteste zuerst). Das System vergibt PIDs auch nicht in aufsteigender Reihenfolge, d.h. ein Prozess kann durchaus eine kleinere PID haben als die vor ihm gestarteten Prozesse.

Ich persönlich hätte das (auf etwas sicherere Art und Weise) auch eher als Unterprogramm implementiert, dass man mit call :KillProcess aufruft (ungetestet):
So, und jetzt hat unser TO wieder einen Schnipsel zum kopieren...

Gruß
Friemler
Bitte warten ..
Mitglied: Peter32
08.09.2016 um 17:14 Uhr
Hallo Biber, vielen Dank für deinen Beitrag!


Zitat von Biber:
Wenn du die noch sortierst nach PIDs...
for /f "tokens=2" %%a in ('tasklist ^| findstr /i /b /c:"sampleprogram.exe ^|sort"') do ( ...
-> dann kommen die kleinsten PIDs zuerst - also toi toi toi die ältesten, die ja zuerst gekillt werden sollen.



Dieser Code funktioniert leider nicht. Wenn ich das "^|sort" dazunehme, liest er plötzlich keine einzige Anzahl mehr aus.
Ich würde aber doch ganz gerne eben den ältesten Prozess beenden...

Du hast etwas mit %counter%-3 erwähnt, kannst du das bitte noch einmal etwas genauer erklären oder an einem Beispiel klar machen?

Danke im Voraus!

Liebe Grüße
Peter
Bitte warten ..
Mitglied: Biber
08.09.2016, aktualisiert um 17:25 Uhr
Moin Friemler,

danke für die Info - wusste ich nicht, dass tasklist die Prozesse nach Alter ausgibt.
Ich hatte auch nur mal kurz angetestet mit "svchost.exe" - der Prozesse läuft ja immer ein Dutzend mal- und gesehen, dass die Reihenfloge der PIDs nicht aufsteigend ist.
Nachvollziehbar wäre für mich gewesen, wenn die Redmonder PraktikantInnen jeweils eine neue PID aus einer Sequence o.ä. ermittelten - also immer eine höhere PID als schon mal vergeben.
Gibt aber anscheinend für die echten Profis auch andere Implementierungsmöglichkeiten.

Grüße
Biber
Bitte warten ..
Mitglied: Biber
08.09.2016, aktualisiert um 17:24 Uhr
Upps, Peter32,

ich habe ein Anführungszeichen nach dem Wort sort zuviel.bzw an der falschen Stelle.. das dürfte das Problem sein.
Aber bitte lies erst Friemlers Kommentar - meine Strategie ist hier ohnehin falsch..
In meinem Kommentar an den Pjordorf-Peter korrigiere ich es gleich.

Grüße
Biber
Bitte warten ..
Ähnliche Inhalte
Java
Programm in Java immer langsam?
Frage von imebroJava30 Kommentare

Hallo, zunächst mal: Ich bin kein Programmierer ;-) Wir haben nun ein neues Programm, welches Antragsdaten verarbeitet. Ebenso werden ...

Linux Desktop
Kopiervorgang langsam
Frage von DaniLinux Desktop8 Kommentare

Guten Morgen werte Kolleginnen und Kollegen, nachdem ich mich entschlossen habe Privat auf Windows auf Linux umzusteigen, kommen nach ...

Multimedia
Diashow Programm
gelöst Frage von 77282Multimedia6 Kommentare

Hallo, ich suche eine Software zum Diashow erstellen. Möchte gerne Videoclips und Bilder hinzufügen können und das Ganze mit ...

Netzwerke
Netzwerkzugriff langsam
gelöst Frage von slanskyNetzwerke5 Kommentare

Hallo Leute, ich habe folgendes Problem: Wir haben mehrere Rechner innerhalb der Firma umgezogen. Das bedeutet die Rechner sind ...

Neue Wissensbeiträge
Off Topic

Rechtliche Grundlagen: Datenschutz und Datensicherheit im Homeoffice

Information von AnkhMorpork vor 1 StundeOff Topic

Sollte bekannt sein, aber P.S.: Findet jemand ein angemessenes Thema?

Router & Routing
"Upgrade" Fritte 7520 zu Fritte 7530 :-)
Information von Lochkartenstanzer vor 4 StundenRouter & Routing5 Kommentare

Moin, wie sich herausgestellt hat, ist die 7520 eine per Software kastrierte Version der 7530. Per "Chiptuning", um es ...

Informationsdienste

RKI - Corona-Datenspende App zur Erfassung von Informationen und Ausbreitung des Coronavirus (SARS-CoV-2) in Deutschland

Information von Frank vor 1 TagInformationsdienste3 Kommentare

Das Robert Koch-Institut stellt ab sofort eine App zur Verfügung, die ergänzende Informationen dazu liefern soll, wo und wie ...

Sicherheit

Gefährliche Sicherheitslücken im HP Support Assistant sind immer noch offen

Information von transocean vor 1 TagSicherheit

Moin, es wird empfohlen, den HP Support Assistenten aus Sicherheitsgründen zu deinstallieren. Lest selbst Gruß Uwe

Heiß diskutierte Inhalte
Schulung & Training
IT-Bedarf ermitteln
gelöst Frage von malikaSchulung & Training70 Kommentare

Hallo zusammen, ich würde gerne Eure Kritik oder Ratschläge zum Ermitteln des IT-Bedarfs für ein Steuerbüro (2 Steuerberater, 1 ...

Rechtliche Fragen
Nachweispflicht für Status-Emails?
Frage von VincentGdGRechtliche Fragen33 Kommentare

Moin. Mein Kollege und Datenschutzbeauftragter erfreut mich täglich mit neuen Auslegungen. Heute erklärt er mir, wir müssen die Status-Emails, ...

Schulung & Training
Admin Hygiene an APs (Zur Zeiten von Corona.)
gelöst Frage von NebellichtSchulung & Training26 Kommentare

Hallo Admins, ich stelle mir gerade die Frage(n), wie ich als Admin mich vor Viren und Bakterien schützen kann ...

Switche und Hubs
Kaufberatung: 16 Port GBit unmanaged Switch mit POE
Frage von HTP.ProXySwitche und Hubs18 Kommentare

Hallo zusammen, ich bin auf der Suche nach einem passiv gekühlten, unmanaged Switch mit 16 oder mehr Ports und ...