Autohotkey run Befehl, cmd.exe und conhost.exe Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
Frosti
Posts: 426
Joined: 27 Oct 2017, 14:30
Contact:

Autohotkey run Befehl, cmd.exe und conhost.exe

17 Jan 2019, 15:12

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.
User avatar
Gerdi
Posts: 185
Joined: 03 Aug 2015, 18:48
Location: Germany
Contact:

Re: Autohotkey run Befehl, cmd.exe und conhost.exe

17 Jan 2019, 16:31

Ich kann das Verhalten nicht reproduzieren.
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
zum Vergleich direkt nach Neustart des Win 10 PC's

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
Kannst Du genauer beschreiben wann das Zumüllen erfolgt oder wie Du dieses feststellst?
Win 10 Home (x64) and Win 11 Pro N
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
User avatar
Frosti
Posts: 426
Joined: 27 Oct 2017, 14:30
Contact:

Re: Autohotkey run Befehl, cmd.exe und conhost.exe

18 Jan 2019, 02:18

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.
User avatar
Frosti
Posts: 426
Joined: 27 Oct 2017, 14:30
Contact:

Re: Autohotkey run Befehl, cmd.exe und conhost.exe

18 Jan 2019, 09:13

Dies ist ein Screenshot vom Taskmanager. Nach unten ging es noch weiter.

Image

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

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:
Image
User avatar
Frosti
Posts: 426
Joined: 27 Oct 2017, 14:30
Contact:

Re: Autohotkey run Befehl, cmd.exe und conhost.exe

18 Jan 2019, 09:39

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.
Image

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?
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Autohotkey run Befehl, cmd.exe und conhost.exe

18 Jan 2019, 10:02

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?
User avatar
Frosti
Posts: 426
Joined: 27 Oct 2017, 14:30
Contact:

Re: Autohotkey run Befehl, cmd.exe und conhost.exe

18 Jan 2019, 10:23

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.

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
}

User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Autohotkey run Befehl, cmd.exe und conhost.exe  Topic is solved

18 Jan 2019, 11:31

Diese Funktion ruft sich selber auf:

Code: Select all

Funktion() {
	static _ := Funktion()
	Msgbox Ich rufe mich selbst 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.
Recommends AHK Studio
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Autohotkey run Befehl, cmd.exe und conhost.exe

18 Jan 2019, 11:47

Isoliert scheint die Funktion richtig zu funktionieren und sie räumt korrekt nach sich auf.
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
}
AHK Version: 1.1.30.1
Windows 8.1
Recommends AHK Studio
User avatar
Frosti
Posts: 426
Joined: 27 Oct 2017, 14:30
Contact:

Re: Autohotkey run Befehl, cmd.exe und conhost.exe

18 Jan 2019, 11:51

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?

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
		}
}
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Autohotkey run Befehl, cmd.exe und conhost.exe

18 Jan 2019, 12:13

Um sich selbst aufzurufen werden immer statische variablen verwendet.
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.
}
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.
Recommends AHK Studio
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Autohotkey run Befehl, cmd.exe und conhost.exe

19 Jan 2019, 03:56

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 selbst

Code: Select all

DieFunktion() {
	Static AutomatischerAufruf := DieFunktion()
	...
	...
}
als auch andere Funktionen aufrufen

Code: Select all

Funktion1() {
	...
	...
}

Funktion2() {
	Static AutomatischerAufruf := Funktion1()
	...
	...
}
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.
User avatar
Frosti
Posts: 426
Joined: 27 Oct 2017, 14:30
Contact:

Re: Autohotkey run Befehl, cmd.exe und conhost.exe

19 Jan 2019, 09:05

:beer: Gracias, jetzt habe ich eine Möglichkeit die Stelle im Code zu finden.
User avatar
Gerdi
Posts: 185
Joined: 03 Aug 2015, 18:48
Location: Germany
Contact:

Re: Autohotkey run Befehl, cmd.exe und conhost.exe

23 Jan 2019, 10:38

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.
Win 10 Home (x64) and Win 11 Pro N
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: gero and 24 guests