Laufendes Programm updaten/ersetzen

badday

Erfahrenes Mitglied
Moin zusammen,

ich schreibe gerade an einem Updater. Ich stehe nun vor dem Problem, wie ich das Porgramm selbst (das binary des Updaters) updaten soll. Unter Unix-artigen System sollte dies wohl relativ einfach sein, da ich hier wohl nur ein kleines Skript starten muss, dass die Datei ersetzt (diese Datei, die den alten Updater ersetzt liegt bereits lokal im selben Verzeichnis). Unter Windows ist das wohl etwas schwieriger, da ich erst sicherstellen muss, dass das Programm beendet ist. Dafür brauche ich wohl so etwas wie eine Prozessliste.

Kann mir jemand sagen, wie solch ein Skript (sowohl für Linux als auch für Windows) aussieht (hat vll. jemand eins rumliegen?). Ansonsten wäre ich auch für jeden Link, der mir helfen könnte sehr dankbar.


Gruß,

badday
 
Also, ich weiß ja nicht, obs an mir liegt, aber ich kann ein die exe von einem laufenden Programm ohne Probleme ändern.
Die Änderungen werden vermutlich eben erst beim nächsten Programmstart merkbar
Oder willst du in den laufenden Prozess eingreifen?

PS: Win XP
 
Zuletzt bearbeitet:
Nutzt du ein Unix-artiges Betriebssystem? Die andere Frage ist, ob das immer sicher funktioniert.

Gruß,

badday
 
So rein naiv gedacht würde ich sagen, dass das von der Grösse des Images abhängt. Wenn das ausgeführte Programm kleiner als die Grösse eines Codechunks ist, so wird es komplett in den Speicher geladen und dürfte daher änderbar sein. Wenn das nicht so ist und also ständig wieder ein Chunk aus der Datei geladen wird und ausgeführt wird müsste m.E. die Datei während der Ausführung konsistent sein.
 
Das würde aber wiederum bedeuten, dass ich mich nicht darauf verlassen kann. Gibt es hier einen Unterschied zwischen Unix-artigen OSes und Windows?

Gruß,

badday
 
Da gibt es bestimmt Unterschiede, so viel ich weiss verwenden unix-Systeme ein anderes ausführbares Format als Windows-Systeme.
 
Was meinst du jetzt genau mit "ausführbares Format"? Ich meinte, ob sich das dahingehend unterscheidet, dass man bei Unix-artigen OSes ein Ersetzen im laufenden Betrieb vornehmen kann und bei Windows nicht.

Gruß,

badday
 
Das ist eigentlich so ziemlich genau an den Unterschied in den Formaten gekoppelt. Es kommt ganz draufan, was ein Unix-System mit einer Datei macht, die ausgeführt wird verglichen mit Windows. Unix-Systeme interessieren mich grundsätzlich überhaupt nicht, daher kann ich diesbezüglich nur raten, aber unter Windows würde ich auf keinen Fall allgemein sagen, dass sich jede ausgeführte Datei ändern lässt (wie oben beschrieben).
 
Ich werde das Programm beenden, nachdem das Skript von dort aufgerufen wurde. Das Skript müsste damit nur warten, bis das Programm nicht mehr in der Prozessliste auftaucht. Wie stelle ich das am besten an?

Gruß,

badday
 
Eine spontane Idee wäre:
Du übergibst als Kommandozeile an das Programm, das aufgerufen wird deine eigene Prozessid, die ja auf allen OS schätze ich mal einfach herauszufinden ist (auf Windows auf jeden Fall). Das aufgerufene Programm liest die Prozessid aus und führt OS-spezifische Befehle aus, welche auf die Terminierung des Prozess warten (Windows z.B. OpenProcess und falls da ein gültiger Handle zurückkommt mit MsgWaitForMultipleObjects warten).
 
Zurück