DOS shell - Befehl im Hintergrund ausführen

Hallo,

ich möchte mein Programm über Kommandozeile starten und zu guter letzt mit Hilfe von hprof und jmap ein Speicherleck darin ausfindig machen.

Nun mache ich:
java
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9000
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-agentlib:hprof=heap=dump,file=/tmp/hprof.bin,
format=b,depth=10
-jar KI.jar > log.0 2>&1

um das Programm zu starten… dabei leite ich stderr und stdout weiter in log.0. Ich suche eigentlich nur ein Synonym zu dem in Linux verwendeten „&“ was dazu führt, dass das Programm im Hintergrund ausgeführt wird. (Bsp: java -jar KI.jar &> log.0 & - gebe ich in meiner Linux shell ein und alles ist gut :smile: )

Leider konnte ich trotz langer suche nichts finden… wahrscheinlich die falschen Stichwörter :frowning: Mir ist bewusst das ich auch einfach eine 2. Konsole starten usw. aber es geht nur ums Prinzip. :smile:

Danke im voraus.

Viele Grüße,
Marco

DOS ist ein sogenanntes Single-Task-System (im Gegensatz zu neueren Betriebssystemen, die Multitask-fähig sind). Das bedeutet: In DOS können keine Programme „im Hintergrund“ ausgeführt werden - Singletask bedeutet, daß immer nur ein Programm gleichzeitig laufen kann. Ein anderes Programm kann nur gestartet werden, wenn das vorigen beendet ist.
Das Einzige, was „im Hintergrund“ laufen KANN unter DOS, sind speicherresidente Programme, die im Interrupt „eingeklinkt“ sind (z.B. im Timer- oder Tastatur-Interrupt o.ä.) - diese werden hardwaremäßig zu bestimmten Ereignissen ausgelöst. (z.B. in bestimmten Zeitintervallen beim Timer-Interrupt oder immer, wenn Taste gedrückt/losgelassen wird beim Keyboard-Interrupt - es gibt auch noch andere…) Dies sind aber nur kurze Programmteile, die „hintenherum“ irgendetwas ausführen - oft auch so Treiber für Peripheriegeräte.
Aber ganze Programme können unter DOS nicht ohne weiteres „im Hintergrund“ laufen - d.h., damit ein Programmteil „im Interrupt“ läuft, muß es schon entsprechend dafür programmiert sein.
Um zwei „DOS-Programme“ gleichzeitig auszuführen, wird es also wohl keine andere Möglichkeit geben, als unter einem Multitask-fähigen System zwei „DOS-Fenster“ zui starten (sofern dies vom System unterstützt wird).
ABER: Normalerweise laufen die DOS-Emulationen in einem „abgegrenzten Raum“ und können nicht mit dem restlichen System interagieren - außer über Dateizugriffe. (D.h. es ist z.B. möglich, daß ein Programm ein File auf die Festplatte schreibt und ein anderes aus dem selben File liest. Dazu müssen aber beide Programme das File im sogenannten „Shared-Modus“ geöffnet haben, also daß mehrere „Instanzen“ gleichzeitig auf dasselbe File zugreifen dürfen, während es geöffnet ist - anderenfalls ist ein geöffnetes File für jedes andere Programm außer für das, von dem es geöffnet wurde, für Zugriffe gesperrt.)

Ich hoffe, ich konnte helfen. Falls es noch sonstige Fragen zu diesem Thema oder allgemein zu DOS, Programmierung in DOS ö.ä. gibt, bin ich auch weiterhin bereit, zu helfen.

Hallo Marco,

ich verstehe noch nicht ganz Dein Anliegen. Du kannst Befehle, die Du über die DOS-Ebene einzeln aufrufen würdest, natürlich einfach in eine Datei mit der Endung .BAT packen und als ersten Befehl - falls Du nicht willst, dass auf dem Bildschirm etwas zu sehen ist - den Befehl @echo off eingeben.
Aber ich bin mir nicht sicher, ob das wirklci Dein Problem ist, weil die Lösung natürlich trivial ist.

Hallo Enrico,

vielen Dank für diese ausführliche Antwort. Hat mir weitergeholfen und soweit keine Fragen mehr, danke!

Viele Grüße,
Marco

Hallo Peeka,

im Allgemeinen ging es mir nur darum ob ich mein Programm im Hintergrund laufen lassen kann und in derselben Konsole einfach mittels jmap mir den heap in ne file packen und mit Hilfe von jhat dann den heap parsen und mit nem browser anschauen.
Es ging einfach nur um das Prinzip, und Enrico war ja so nett mir genauer zu erläutern warum das nicht möglich ist und in welche Ausnahmefällen es gibt.

Meine Ausgaben schreibe ich ja absichtlich in die Datei, weil ich einige Meldungen von meinem Programm ganz gut brauchen kann für die Analyse.

Aber danke fürs lesen und antworten!

Viele Grüße,
Marco

hi Marco , leider kann ich dir in diesem Fall auch nicht helfen … meine Kenntnisse in Linux hab ich in letzter sehr vernachlässigt …

Hallo Marco,

das & gibt es in den Windows Betriebssystemen nicht. Wenn ich ein Programm im Hintergrund starten möchte, dann lasse ich es mit „at“ starten. Bei so langen Kommandozeilen mache ich für den Start eine Batch-Datei. Es geht aber natürlich auch so.

Um also die Konsole im Hintergrund zu starten:

at 20:58 c:\Programme\java\bin\java.exe -Dcom.sun....

Dann startet das Programm zur angegebenen Uhrzeit in einer eigenen Shell.

Viele Grüße
Martin

Die wirklich gesuchte Antwort war:
start /b java …
Damit kann man jedes Programm in einer Dos-Shell unter Windows (aber nicht im Original-DOS, was hier aber auch gar nicht gemeint war) starten, ohne eine neue Konsole zu starten.