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 IPWünsch Dir wasWebbrowserWebentwicklungWeiterbildungWindows 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, 1223 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
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 ...

LAN, WAN, Wireless
LAN Plötzlich langsam
gelöst Frage von KodaCHLAN, WAN, Wireless12 Kommentare

Hallo zusammen Ich habe seit heute Plötzlich das Problem, dass mein Netzwerk langsam ist. Alle Geräte sind per GB ...

Neue Wissensbeiträge
Humor (lol)
BioShield gegen 5G
Information von magicteddy vor 23 StundenHumor (lol)3 Kommentare

Moin wer sich gegen die hochgefährlichen 5G schützen möchte wird hier fündig: 5GBioShield "gegen 5G-Strahlung" Ich glaube, ich sollte ...

Windows Server

ScheduledTasks mit einem Group-Managed-Service-Account (GMSA) ausführen

Anleitung von ToniHo vor 1 TagWindows Server

Hallo zusammen, wer schonmal versucht hat ein Group-Managed-Service-Account (GMSA) auf einem bestehenden ScheduledTask einzutragen, ist an der GUI vermutlich ...

Humor (lol)
Anti 5G USB Stick
Information von Ex0r2k16 vor 1 TagHumor (lol)14 Kommentare

Perfekt für den Freitag, findet sich hier ein Businesspartner der mit mir zusammen einen Anti 6G Esoterik Stick rausbringt? ...

Hardware
Raspberry mit 8 GB
Information von sabines vor 1 TagHardware

Der Raspberry ist nun nach der 4 GB Variante mit 8 GB verfügbar, und demnächst soll es auch eine ...

Heiß diskutierte Inhalte
Windows 10
Win 10 Problem Intergeschwindigkeit aber LAN OK
Frage von helpmikeWindows 1021 Kommentare

Hallo, versuche mal das Problem zu beschreiben. Der PC (i5 9600 / 16 GB / H370M / Intel 1 ...

Festplatten, SSD, Raid
WD My Book Platine tauschen?
gelöst Frage von WandaStaabFestplatten, SSD, Raid19 Kommentare

Schönen guten Abend! Eine Bekannte bat mich, ihre externe Festplatte, eine WD My Book 4TB (wdbfjk0040hbk-04), anzuschauen, die sich ...

Router & Routing
Portfreigabe NAS Fritzbox
gelöst Frage von dbox3Router & Routing14 Kommentare

Hallo zusammen, ich habe ein Netzwerk eingerichtet (s.Bild) bei dem ich auf dem NAS der FB7490 mit der IP ...

Exchange Server
Windows Exchange Server 2010 ablösen durch neuen Exchange Server 2016 - Was beachten
Frage von server0815Exchange Server14 Kommentare

Hallo, ich habe die Aufgabe bekommen unseren nun schon etwas in die Jahre gekommenen Exchange Server 2010 (Version 14.03.0487.000) ...