Erfolgreiches neues Jahr allen,
Seit geraumer Zeit habe ich mich gefragt, warum sich im Laufe eines Tages die cmd.exe und conhost.exe als Prozesse ansammeln.
Soviel ich herausbekommen habe startet der Autohotkey-Befehl run eine Befehlzeilenkonsole.
Leider wird diese im Anschluß nicht geschlossen.
Scheinbar passiert genau dasselbe wenn ich die Funktion StdOutToVar von Cocobeglica benutze.
So sammeln sich bis zu 30x2 Konsolen a 5MB als Prozesse an und warten auf Eingabe. Das macht sich auf meiner Workstation zwar kaum bemerkbar, aber auf den Clients im Netzwerk schon.
Warum ist das so? Ich finde keine Lösung für mein Problem.
Autohotkey run Befehl, cmd.exe und conhost.exe Topic is solved
Moderator: jNizM
Re: Autohotkey run Befehl, cmd.exe und conhost.exe
Ich kann das Verhalten nicht reproduzieren.
Habe nach einigen AHK -Run Befehlen
folgendes in der PowerShell eingeben:
zum Vergleich direkt nach Neustart des Win 10 PC's
Kannst Du genauer beschreiben wann das Zumüllen erfolgt oder wie Du dieses feststellst?
Habe nach einigen AHK -Run Befehlen
folgendes in der PowerShell eingeben:
Code: Select all
PS C:\Program Files (x86)\ZackZackOrdner> Get-Process c*
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
311 17 3916 5724 0,92 12268 1 CastSrv
218 14 3148 9640 0,06 9448 1 CLMLSvc_P2G8
116 7 5312 4268 5732 0 conhost
189 12 3580 11792 1,28 11884 1 conhost
323 23 23568 15468 3808 0 conveyor-svc
872 26 2060 4968 680 0 csrss
832 23 3192 7068 804 1 csrss
506 15 11756 19336 28,56 3404 1 ctfmon
Code: Select all
PS C:\Users\Gerd> Get-Process c*
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
326 18 4308 3564 0,17 11552 1 CastSrv
229 15 3396 11532 0,06 13384 1 CLMLSvc_P2G8
116 7 5368 9048 3348 0 conhost
239 13 3824 13604 0,14 12480 1 conhost
325 24 24372 34160 4152 0 conveyor-svc
939 26 2332 5452 644 0 csrss
718 20 3160 6868 760 1 csrss
384 15 3504 13628 0,63 3288 1 ctfmon
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
Re: Autohotkey run Befehl, cmd.exe und conhost.exe
Es lässt sich für jede laufende Befehlszeilenkonsole selbst wenn der startende Prozess nicht mehr existiert das Verzeichnis anzeigen aus dem der Aufruf erfolgte (Process Hacker anstatt Taskmanager).Die Einträge verweisen auf meine Skriptordner.
Im Moment beende ich jetzt nach jedem run-Befehl per 'Process,Close,cmd.Exe' und conhost.exe die Konsole. Das beendet aufgrund meines unüberprüften Aufrufes aber auch die Konsolen anderer Prozeße.
Ich stelle nachher den Code der Skripte rein und überprüfe ob die Clients tatsächlich auch selbiges Verhalten zeigen.
Im Moment beende ich jetzt nach jedem run-Befehl per 'Process,Close,cmd.Exe' und conhost.exe die Konsole. Das beendet aufgrund meines unüberprüften Aufrufes aber auch die Konsolen anderer Prozeße.
Ich stelle nachher den Code der Skripte rein und überprüfe ob die Clients tatsächlich auch selbiges Verhalten zeigen.
Re: Autohotkey run Befehl, cmd.exe und conhost.exe
Dies ist ein Screenshot vom Taskmanager. Nach unten ging es noch weiter.
Ich starte ein externes Skript und beende das laufende. Ich übergebe den zu startenden Pfad an das externe Skript.
Die Optionen ScriptHwnd und ScriptPID werden eigentlich nicht mehr gebraucht, da ich jetzt ExitApp eingefügt habe.
Die "2" vor A_ScriptHwnd steht für eine Verzögerung von 2 Sekunden. Die "1" am Ende steht für die Option das Skript mit Autohotkey_H auszuführen.
(Die Autohotkey_H exe-Datei habe ich umbenannt damit ich weiß welche exe gerade das Skript ausführt.)
Dies ist das Skript für den Neustart des aufrufenden Skriptes.
Beide Codes produzieren jeweils eine cmd.exe und eine conhost.exe. Die Autohotkey_H Version ist die neueste denke ich (da gerade vor 5 Tagen erst heruntergeladen).
Mein Problem tritt aber auch bei allen Clients auf die ihre Skripte mit Autohotkey v1.1.30.01 32bit auf wie man ja sehen kann.
Meine Workstation und ein Client sind über Nacht an. Der Client wartet auf Labordaten und deshalb wird das entsprechende Skript zum Datumswechsel neu gestartet.
Mit dem üblichen Reload-Befehl liefen die Skripte im Anschluss nicht so gut, als wenn ich sie beende und per Hand jeweils neu starte. Dies schreibe ich nur falls die Frage aufkommt, warum ich es so umständlich brauche.
So sieht es am Client aus:
Ich starte ein externes Skript und beende das laufende. Ich übergebe den zu startenden Pfad an das externe Skript.
Die Optionen ScriptHwnd und ScriptPID werden eigentlich nicht mehr gebraucht, da ich jetzt ExitApp eingefügt habe.
Die "2" vor A_ScriptHwnd steht für eine Verzögerung von 2 Sekunden. Die "1" am Ende steht für die Option das Skript mit Autohotkey_H auszuführen.
(Die Autohotkey_H exe-Datei habe ich umbenannt damit ich weiß welche exe gerade das Skript ausführt.)
Code: Select all
SkriptReload:
Script:= A_ScriptDir "\" A_ScriptName
scriptPID := DllCall("GetCurrentProcessId")
If !AddendumDir
AddendumDir := A_ScriptDir
run, Autohotkey.exe /f "%AddendumDir%\include\RestartScript.ahk" "%Script%" "2" "%A_ScriptHwnd%" "%scriptPID%" "1"
ExitApp
return
Dies ist das Skript für den Neustart des aufrufenden Skriptes.
Code: Select all
#NoENV
#NoTrayIcon
FullAppPath := A_Args.1
delay := A_Args.2
scriptHwnd := A_Args.3
scriptPID := A_Args.4
runAutohotkeyH:= A_Args.5
Sleep, % delay*1000
If (runAutohotkeyH = 1)
Run, %A_ScriptDir%\AHK_H\x64w\AutohotkeyH_U64.exe /f "%FullAppPath%"
else
Run, Autohotkey.exe /f "%FullAppPath%"
ExitApp
Mein Problem tritt aber auch bei allen Clients auf die ihre Skripte mit Autohotkey v1.1.30.01 32bit auf wie man ja sehen kann.
Meine Workstation und ein Client sind über Nacht an. Der Client wartet auf Labordaten und deshalb wird das entsprechende Skript zum Datumswechsel neu gestartet.
Mit dem üblichen Reload-Befehl liefen die Skripte im Anschluss nicht so gut, als wenn ich sie beende und per Hand jeweils neu starte. Dies schreibe ich nur falls die Frage aufkommt, warum ich es so umständlich brauche.
So sieht es am Client aus:
Re: Autohotkey run Befehl, cmd.exe und conhost.exe
Ich habe folgendes gerade probiert. An den Anfang des Skriptes das ich neu laden möchte, habe ich den Pause-Befehl geschrieben. Es werden also nur alle Bibliotheken, die Hotkeys/Hotstrings erstellt und OnExit gesetzt. Es werden keine Zeilen des Skriptes ausgeführt.
Wenn ich auf der Workstation das Skript starte und ich habe Scite4Autohotkey nicht geöffnet. Gibt es eine folgende Fehlermeldung während des Including der SciteOutPut.ahk Bibliothek. Ich frage mich wieso? Denn dieser Vorgang sollte doch jetzt noch nicht ausgeführt werden.
Dies erklärt dennoch erstmal nicht die Ansammlung der Befehlskonsole oder vielleicht doch? Kann es sein er rauscht z.B. durch eine inkludierte Funktion wie diese hier : StdOutToVar() und startet da einfach mal die Konsole gleich?
Wenn ich auf der Workstation das Skript starte und ich habe Scite4Autohotkey nicht geöffnet. Gibt es eine folgende Fehlermeldung während des Including der SciteOutPut.ahk Bibliothek. Ich frage mich wieso? Denn dieser Vorgang sollte doch jetzt noch nicht ausgeführt werden.
Dies erklärt dennoch erstmal nicht die Ansammlung der Befehlskonsole oder vielleicht doch? Kann es sein er rauscht z.B. durch eine inkludierte Funktion wie diese hier : StdOutToVar() und startet da einfach mal die Konsole gleich?
Re: Autohotkey run Befehl, cmd.exe und conhost.exe
Moin,
mir erschließt sich nicht, warum jede Ausführung des AHK Run Kommandos eine conhost.exe und eine cmd.exe starten sollte. Passiert das bei Dir auch bei einem Run Notepad.exe?
Die Funktion StdOutToVar wird aber oft genutzt, um die Ausgaben aus einem Cmd-Fenster einzulesen. Wofür benutzt Du die Funktion und wie wird sie aufgerufen?
mir erschließt sich nicht, warum jede Ausführung des AHK Run Kommandos eine conhost.exe und eine cmd.exe starten sollte. Passiert das bei Dir auch bei einem Run Notepad.exe?
Die Funktion StdOutToVar wird aber oft genutzt, um die Ausgaben aus einem Cmd-Fenster einzulesen. Wofür benutzt Du die Funktion und wie wird sie aufgerufen?
Re: Autohotkey run Befehl, cmd.exe und conhost.exe
Beim Aufruf von run notepad.exe passiert es nicht. Auch so nicht run Autohotkey.exe /f "D:\Skripte\Calendar.ahk".
Also kann es auch nicht reproduzierbar für Euch sein.
Dann müsste es was mit meiner AddendumFunctions.ahk Bibliothek und der enthaltenen StdOutVar Funktion zu tun haben.
Damit lese ich die Konsolenausgaben der xpdf-tools ein (unter anderem).
Doch wieso passiert dies auch wenn die Funktion noch gar nicht gebraucht wird?
Nachtrag:
folgende Funktion in der Bibliothek macht das. Habe diese entfernt jetzt ist alles gut. Aber warum wird diese scheinbar bei einem Start aufgerufen?
Diese wird überhaupt nicht benötigt und ist eigentlich Ballast.
Es bleibt aber weiterhin dabei das SciteOutPut.ahk einen Fehler produziert.
Also kann es auch nicht reproduzierbar für Euch sein.
Dann müsste es was mit meiner AddendumFunctions.ahk Bibliothek und der enthaltenen StdOutVar Funktion zu tun haben.
Damit lese ich die Konsolenausgaben der xpdf-tools ein (unter anderem).
Doch wieso passiert dies auch wenn die Funktion noch gar nicht gebraucht wird?
Nachtrag:
folgende Funktion in der Bibliothek macht das. Habe diese entfernt jetzt ist alles gut. Aber warum wird diese scheinbar bei einem Start aufgerufen?
Diese wird überhaupt nicht benötigt und ist eigentlich Ballast.
Es bleibt aber weiterhin dabei das SciteOutPut.ahk einen Fehler produziert.
Code: Select all
GetStdOut(cmd, init:=false) {
;Get StdOut by Coco - it's working with AHK v1.1.28 on Windows8
;https://autohotkey.com/boards/viewtopic.php?t=3941
static base := {__New:"GetStdOut", __Delete:"GetStdOut"}
static on_exit := new base(true)
if IsObject(cmd) {
if init {
dhw := A_DetectHiddenWindows
DetectHiddenWindows On
Run %ComSpec% /k,, Hide UseErrorLevel, pid
if (ErrorLevel == "ERROR")
return false
while !WinExist("ahk_pid " pid)
Sleep 10
DllCall("AttachConsole", "UInt", cmd.PID:=pid)
DetectHiddenWindows %dhw%
} else {
DllCall("FreeConsole")
Process Close, % cmd.PID
}
return init ? cmd : true
}
shell := ComObjCreate("WScript.Shell")
exec := shell.Exec(cmd)
while !exec.StdOut.AtEndOfStream
stdout := exec.StdOut.ReadAll()
return stdout
}
Re: Autohotkey run Befehl, cmd.exe und conhost.exe Topic is solved
Diese Funktion ruft sich selber auf:
Deine GetStdOut macht das selbe. Dabei wird eine Konsole erzeugt und der dabei enstehende Prozess über die PID speichert.
Um den dabei entstehenden Prozess auch wieder zu schließen wird eine Instanz der Klasse Base erstellt und die PID übergeben.
Wenn AHK nun geschlossen wird, wird die __Delete methode dieses Objektes aufgerufen und diese schließt dann wahrscheinlich deinen Prozess.
Ich würde jetzt einfach mal raten, dass diese Base Klasse entfernt/verändert wurde.
EDIT: Ich sehe grade, dass diese Base Klasse in der Funktion selber erstellt wird - ich teste das mal im Detail aus.
Code: Select all
Funktion() {
static _ := Funktion()
Msgbox Ich rufe mich selbst auf
}
Um den dabei entstehenden Prozess auch wieder zu schließen wird eine Instanz der Klasse Base erstellt und die PID übergeben.
Wenn AHK nun geschlossen wird, wird die __Delete methode dieses Objektes aufgerufen und diese schließt dann wahrscheinlich deinen Prozess.
Ich würde jetzt einfach mal raten, dass diese Base Klasse entfernt/verändert wurde.
EDIT: Ich sehe grade, dass diese Base Klasse in der Funktion selber erstellt wird - ich teste das mal im Detail aus.
Recommends AHK Studio
Re: Autohotkey run Befehl, cmd.exe und conhost.exe
Isoliert scheint die Funktion richtig zu funktionieren und sie räumt korrekt nach sich auf.
Zum testen:AHK Version: 1.1.30.1
Windows 8.1
Zum testen:
Code: Select all
#SingleInstance, Off
#Persistent
SetTimer, test, 100
test:
Run %A_LineFile%
ExitApp
GetStdOut(cmd, init:=false) {
;Get StdOut by Coco - it's working with AHK v1.1.28 on Windows8
;https://autohotkey.com/boards/viewtopic.php?t=3941
static base := {__New:"GetStdOut", __Delete:"GetStdOut"}
static on_exit := new base(true)
if IsObject(cmd) {
if init {
dhw := A_DetectHiddenWindows
DetectHiddenWindows On
Run %ComSpec% /k,, Hide UseErrorLevel, pid
if (ErrorLevel == "ERROR")
return false
while !WinExist("ahk_pid " pid)
Sleep 10
DllCall("AttachConsole", "UInt", cmd.PID:=pid)
DetectHiddenWindows %dhw%
} else {
DllCall("FreeConsole")
Process Close, % cmd.PID
}
return init ? cmd : true
}
shell := ComObjCreate("WScript.Shell")
exec := shell.Exec(cmd)
while !exec.StdOut.AtEndOfStream
stdout := exec.StdOut.ReadAll()
return stdout
}
Windows 8.1
Recommends AHK Studio
Re: Autohotkey run Befehl, cmd.exe und conhost.exe
Interessant. Ich hatte zwar den englischen Thread gelesen, aber nicht verstanden und bis jetzt nicht gewusst das es selbst aufrufende Funktionen gibt.
Danke!
Ist die SciteOutPut Funktion auch selbst aufrufend?
Danke!
Ist die SciteOutPut Funktion auch selbst aufrufend?
Code: Select all
SciTEOutput(Text,Clear=1,LineBreak=1,Exit=0) {
SciObj := ComObjActive("SciTE4AHK.Application") ;get pointer to active SciTE window
If (Clear=1)
SendMessage, SciObj.Message(0x111, 420) ;If clear=1 Clear output window
If (LineBreak=1)
SetEnv,Text,`r`n%text% ;If LineBreak=1 prepend text with `r`n
SciObj.Output(Text) ;send text to SciTE output pane
If (Exit=1)
{
MsgBox, 36, Exit App?, Exit Application? ;If Exit=1 ask if want to exit application
IfMsgBox,Yes, ExitApp ;If Msgbox=yes then Exit the appliciation
}
}
Re: Autohotkey run Befehl, cmd.exe und conhost.exe
Um sich selbst aufzurufen werden immer statische variablen verwendet.
Diese werden initialisiert bevor die eigentliche Funktion aufgerufen wird und das eigentliche Skript gestartet wird.
Dafür wird immer das Keyword static verwendet. Nun ist die Frage ob deine Funktion das Keyword static verwendet (Tipp es muss am Anfang einer Zeile stehen.)
Bei der GetStdOut Funktion ist das ganze ein bisschen komplexer - ich könnte es im Detail erklären falls jemand Interesse hat.
Diese werden initialisiert bevor die eigentliche Funktion aufgerufen wird und das eigentliche Skript gestartet wird.
Code: Select all
Msgbox Skript Start
funktion() {
;erzeuge eine statische variable mit dem namen variable
;weißt ihr das ergebnis des ausführens dieser funktion zu und ruft dabei diese funktion auf
static variable := funktion()
Msgbox Statische variablen werden initialisiert.
}
Bei der GetStdOut Funktion ist das ganze ein bisschen komplexer - ich könnte es im Detail erklären falls jemand Interesse hat.
Recommends AHK Studio
Re: Autohotkey run Befehl, cmd.exe und conhost.exe
Moin,
es ist so, wie nnnik sagt. Beim Skriptstart automatisch aufgerufene Funktionen werden in der Regel über Funktionsaufrufe bei der Intitialierung statischer Funktionsvariablen programmiert. Dabei kann eine Funktion sowohl sich selbstals auch andere Funktionen aufrufen
Im zweiten Fall kann die Reihenfolge der Funktionen im Skript wichtig sein. Wenn im Skript Funktion1() erst nach Funktion2() definiert ist, sind eventuelle statische Variablen der Funktion1() beim automatischen Aufruf aus Funktion2() noch leer (bzw. nicht initialisiert).
Die von Dir eingestellte Funktion SciTEOutput() enthält keinen eigenen automatischen Aufruf. Der Aufruf muss im Skript an anderer Stelle stecken.
es ist so, wie nnnik sagt. Beim Skriptstart automatisch aufgerufene Funktionen werden in der Regel über Funktionsaufrufe bei der Intitialierung statischer Funktionsvariablen programmiert. Dabei kann eine Funktion sowohl sich selbst
Code: Select all
DieFunktion() {
Static AutomatischerAufruf := DieFunktion()
...
...
}
Code: Select all
Funktion1() {
...
...
}
Funktion2() {
Static AutomatischerAufruf := Funktion1()
...
...
}
Die von Dir eingestellte Funktion SciTEOutput() enthält keinen eigenen automatischen Aufruf. Der Aufruf muss im Skript an anderer Stelle stecken.
Re: Autohotkey run Befehl, cmd.exe und conhost.exe
Gracias, jetzt habe ich eine Möglichkeit die Stelle im Code zu finden.
Re: Autohotkey run Befehl, cmd.exe und conhost.exe
vielleicht hilft Dir auch
; http://the-automator.com/tag/customize-scite/
; https://youtu.be/AauNXvg_hUI?t=193
weiter. Mir erscheint dieser Scite-Output der einfachere Weg.
; http://the-automator.com/tag/customize-scite/
; https://youtu.be/AauNXvg_hUI?t=193
weiter. Mir erscheint dieser Scite-Output der einfachere Weg.
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
Re: Autohotkey run Befehl, cmd.exe und conhost.exe
Danke schaue ich mir jetzt an
Who is online
Users browsing this forum: No registered users and 59 guests