Externes Programm getrennt von Hauptprogramm ausführen?
-
- Beiträge: 142
- Registriert: Sa 30. Jan 2010, 19:35
- OS, Lazarus, FPC: Linux64, Wiindows32, MacOS, Lazarus 1.8.2
- CPU-Target: xxBit
Externes Programm getrennt von Hauptprogramm ausführen?
Hallo,
hier
http://www.lazarusforum.de/viewtopic.php?f=10&t=3509
und hier
http://wiki.lazarus.freepascal.org/Executing_External_Programs/de
finden sich Beschreibungen, wie man in einem Lazarus-Programm ein fremdes Programm ausführt und sogar damit kommuniziert. In allen Beispielen ist jedoch gedacht, daß ein z.B. Kommandozeilentool ausgeführt wird und man wieder zum Hauptprogramm zurückkehrt. Während das fremde Programm abgearbeitet wird, ist das Hauptprogramm gelähmt. Man könnte nun einen tThread kreieren und den Aufruf SysUtils.ExecuteProcess (Exename, Parameter) in Thread.Execute plazieren. Aber wenn das Hauptprogramm beendet wird, wird das externe Programm ebenfalls beendet. Wie starte ich nun ein externes Programm (plattformunabhängig) völlig eigenständig, ohne Verbindungen zum Hauptprogramm, so daß das abgetrennte externe Programm weiterläuft, wenn das Hauptprogramm beendet wird?
Martin
hier
http://www.lazarusforum.de/viewtopic.php?f=10&t=3509
und hier
http://wiki.lazarus.freepascal.org/Executing_External_Programs/de
finden sich Beschreibungen, wie man in einem Lazarus-Programm ein fremdes Programm ausführt und sogar damit kommuniziert. In allen Beispielen ist jedoch gedacht, daß ein z.B. Kommandozeilentool ausgeführt wird und man wieder zum Hauptprogramm zurückkehrt. Während das fremde Programm abgearbeitet wird, ist das Hauptprogramm gelähmt. Man könnte nun einen tThread kreieren und den Aufruf SysUtils.ExecuteProcess (Exename, Parameter) in Thread.Execute plazieren. Aber wenn das Hauptprogramm beendet wird, wird das externe Programm ebenfalls beendet. Wie starte ich nun ein externes Programm (plattformunabhängig) völlig eigenständig, ohne Verbindungen zum Hauptprogramm, so daß das abgetrennte externe Programm weiterläuft, wenn das Hauptprogramm beendet wird?
Martin
Re: Externes Programm getrennt von Hauptprogramm ausführen?
Plattformunabhängig kann ich dir jetzt nicht sagen, unter Linux kannst du das Programm mit nohub starten.
Edit: unter Win könntest du es mit start versuchen
Code: Alles auswählen
nohub programm [parameter]
Edit: unter Win könntest du es mit start versuchen
Code: Alles auswählen
start programm [parameter]
-
- Beiträge: 359
- Registriert: Mi 27. Mai 2009, 20:54
- OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
- CPU-Target: x86
- Wohnort: Cottbus
Re: Externes Programm getrennt von Hauptprogramm ausführen?
Nutze einen TProcess ohne die Option [powaitonexit].
Dann kann man mittels
Das Programm im Hintergrund laufen lassen, und man kann dennoch weiter Arbeiten mit dem Programm.
Dann kann man mittels
Code: Alles auswählen
while proces1.Activ do Application.ProcessMessages;
Das Programm im Hintergrund laufen lassen, und man kann dennoch weiter Arbeiten mit dem Programm.
-
- Beiträge: 142
- Registriert: Sa 30. Jan 2010, 19:35
- OS, Lazarus, FPC: Linux64, Wiindows32, MacOS, Lazarus 1.8.2
- CPU-Target: xxBit
Re: Externes Programm getrennt von Hauptprogramm ausführen?
Hallo,
ich meinte natürlich wie ich das in Lazarus programmiere, nicht wie ich das in der Kommandozeile bzw. im Terminal mache. (Trotzdem danke)
Ich könnte natürlich per SysUtils.ExecuteProcess ein cmd.exe bzw. ein Terminal starten und daraus das Programm dann abtrennen. Ich glaub aber einfach nicht, daß das so kompliziert sein soll. Ich will auch keine Kommunikation u.a., einfach nur extern starten und tschüss.
Martin
ich meinte natürlich wie ich das in Lazarus programmiere, nicht wie ich das in der Kommandozeile bzw. im Terminal mache. (Trotzdem danke)
Ich könnte natürlich per SysUtils.ExecuteProcess ein cmd.exe bzw. ein Terminal starten und daraus das Programm dann abtrennen. Ich glaub aber einfach nicht, daß das so kompliziert sein soll. Ich will auch keine Kommunikation u.a., einfach nur extern starten und tschüss.
Martin
Re: Externes Programm getrennt von Hauptprogramm ausführen?
Wo ist das Problem bei TProcess.ComandLine nohub oder start einzubauen?
Code: Alles auswählen
procedure run(command: string);
var
AProcess: TProcess;
starter: string;
begin
{$ifdef windows}
starter :='start ';
{$else}
starter := 'nohub ';
{$endif}
AProcess := TProcess.Create(nil);
try
AProcess.CommandLine := starter + command;
AProcess.Execute;
finally
AProcess.Free;
end;
end;
-
- Beiträge: 359
- Registriert: Mi 27. Mai 2009, 20:54
- OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
- CPU-Target: x86
- Wohnort: Cottbus
Re: Externes Programm getrennt von Hauptprogramm ausführen?
Und warum nicht mit Lazarus eigenen Mitteln?
Code: Alles auswählen
procedure run(command: string);
var
AProcess: TProcess;
begin
AProcess := TProcess.Create(nil);
AProcess.Options:=AProcess.Options-[poWaitOnExit];
try
AProcess.CommandLine := command;
AProcess.Execute;
while AProcess.Activ do
Application.ProcessMessages;
finally
AProcess.Free;
end;
end;
Re: Externes Programm getrennt von Hauptprogramm ausführen?
Und warum nicht mit Lazarus eigenen Mitteln?
Weil in dem Moment wo das Lazarus-Programm beendet wird, auch der Prozess beendet wird und genau das will der TE vermeiden.
-
- Beiträge: 359
- Registriert: Mi 27. Mai 2009, 20:54
- OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
- CPU-Target: x86
- Wohnort: Cottbus
Re: Externes Programm getrennt von Hauptprogramm ausführen?
Ach tatsächlich, jetzt Lese ich es auch. Lesen sollte man können
Gut! ich nehme alles zurück und behaupte das Gegenteil!
Gruß Teekeks
Gut! ich nehme alles zurück und behaupte das Gegenteil!
Gruß Teekeks
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: Externes Programm getrennt von Hauptprogramm ausführen?
Gibt es hierfür denn nun eine Lösung?
Auch ich möchte Programm2 aus Programm1 starten und Programm1 dann beenden, ohne dass auch Programm2 beendet wird.
Unter http://wiki.freepascal.org/Executing_External_Programs wird es so beschrieben, funktioniert aber nicht (Programm2 wird ebenfalls beendet):
Auch ich möchte Programm2 aus Programm1 starten und Programm1 dann beenden, ohne dass auch Programm2 beendet wird.
Unter http://wiki.freepascal.org/Executing_External_Programs wird es so beschrieben, funktioniert aber nicht (Programm2 wird ebenfalls beendet):
Code: Alles auswählen
Run detached program
Normally a program started by your application is a child process and is killed, when your application is killed. When you want to run a standalone program that keeps running, you can use the following:
var
Process: TProcess;
I: Integer;
begin
Process := TProcess.Create(nil);
try
Process.InheritHandles := False;
Process.Options := [];
Process.ShowWindow := swoShow;
// Copy default environment variables including DISPLAY variable for GUI application to work
for I := 1 to GetEnvironmentVariableCount do
Process.Environment.Add(GetEnvironmentString(I));
Process.Executable := '/usr/bin/gedit';
Process.Execute;
finally
Process.Free;
end;
end;
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: Externes Programm getrennt von Hauptprogramm ausführen?
Ich habe einen Workaround im Netz gefunden
Code: Alles auswählen
procedure Tfrmupdater.StartDetachedProgram(cmd: string);
var
sh: TStringList;
//const fn=Application.Location + PathDelim + 'startdetach';
begin
sh := TStringList.Create;
sh.add('nohup ' + cmd + ' >/dev/null 2>&1 &');
sh.add('disown');
sh.add('exit');
sh.SaveToFile(Application.Location + PathDelim + 'startdetach');
fpSystem('bash < ' + Application.Location + PathDelim + 'startdetach');
deletefile(Application.Location + PathDelim + 'startdetach');
sh.Free;
end;
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
-
- Beiträge: 1224
- Registriert: So 20. Mär 2016, 22:14
- OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
- CPU-Target: Raspberry Pi 3
Re: Externes Programm getrennt von Hauptprogramm ausführen?
Der Würgaround bedingt aber, dass nohub installiert ist. Auch nicht so toll.
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: Externes Programm getrennt von Hauptprogramm ausführen?
Gibt es denn eine andere Lösung?
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
-
- Lazarusforum e. V.
- Beiträge: 3158
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Externes Programm getrennt von Hauptprogramm ausführen?
Timm Thaler hat geschrieben:Der Würgaround bedingt aber, dass nohub installiert ist. Auch nicht so toll.
nohup gehört zu POSIX; daher wird es auf jedem gängigen Linux vorhanden sein - es sei denn, deine Anwender stellen sich ihr Linux selbst von Grund auf zusammen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: Externes Programm getrennt von Hauptprogramm ausführen?
Socke hat geschrieben:Timm Thaler hat geschrieben:Der Würgaround bedingt aber, dass nohub installiert ist. Auch nicht so toll.
nohup gehört zu POSIX; daher wird es auf jedem gängigen Linux vorhanden sein - es sei denn, deine Anwender stellen sich ihr Linux selbst von Grund auf zusammen.
Ja, aber ist eben nicht Plattformübergreifend ...
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
-
- Lazarusforum e. V.
- Beiträge: 317
- Registriert: So 5. Mai 2019, 16:52
- OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 2.0.X, FPC 3.2.0)
- CPU-Target: x86_64, i386
- Wohnort: Bayreuth
Re: Externes Programm getrennt von Hauptprogramm ausführen?
Hallo,
altes Thema, bei dem ich mal den Staub wegwische... Das Problem habe ich aktuell auch und keine wirkliche Lösung gefunden. Vor allem nicht, wenn es plattformübergreifend sein soll.
Gibt es hier keine oder habe ich nicht tief genug gegraben? Noch mal kurz zusammen gefasst:
- ich möchte ein Programm starten
- mein mit Lazarus geschriebenes Programm soll weiter laufen
- das Lazarus Programm beendet sich
- das externe und von mir über das Programm gestartete Programm soll weiter laufen
- das Ganze muss mindestens unter Linux und Windows laufen (Distribution kann ich nicht vorgeben)
nohub als Beispiel habe ich hier unter Arch – zumindest bei mir – nicht installiert. Ist also keine sichere Option für Linux.
cu tb
altes Thema, bei dem ich mal den Staub wegwische... Das Problem habe ich aktuell auch und keine wirkliche Lösung gefunden. Vor allem nicht, wenn es plattformübergreifend sein soll.
Gibt es hier keine oder habe ich nicht tief genug gegraben? Noch mal kurz zusammen gefasst:
- ich möchte ein Programm starten
- mein mit Lazarus geschriebenes Programm soll weiter laufen
- das Lazarus Programm beendet sich
- das externe und von mir über das Programm gestartete Programm soll weiter laufen
- das Ganze muss mindestens unter Linux und Windows laufen (Distribution kann ich nicht vorgeben)
nohub als Beispiel habe ich hier unter Arch – zumindest bei mir – nicht installiert. Ist also keine sichere Option für Linux.
cu tb
Tipp für PostgreSQL: www.pg-forum.de