Externes Programm getrennt von Hauptprogramm ausführen?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Martin V
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?

Beitrag von Martin V »

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

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Externes Programm getrennt von Hauptprogramm ausführen?

Beitrag von DiBo33 »

Plattformunabhängig kann ich dir jetzt nicht sagen, unter Linux kannst du das Programm mit nohub starten.

Code: Alles auswählen

nohub programm [parameter]


Edit: unter Win könntest du es mit start versuchen

Code: Alles auswählen

start programm [parameter]

Teekeks
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?

Beitrag von Teekeks »

Nutze einen TProcess ohne die Option [powaitonexit].
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.

Martin V
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?

Beitrag von Martin V »

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

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Externes Programm getrennt von Hauptprogramm ausführen?

Beitrag von DiBo33 »

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;

Teekeks
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?

Beitrag von Teekeks »

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;

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Externes Programm getrennt von Hauptprogramm ausführen?

Beitrag von DiBo33 »

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.

Teekeks
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?

Beitrag von Teekeks »

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

MacWomble
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?

Beitrag von MacWomble »

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):

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.

MacWomble
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?

Beitrag von MacWomble »

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.

Timm Thaler
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?

Beitrag von Timm Thaler »

Der Würgaround bedingt aber, dass nohub installiert ist. Auch nicht so toll.

MacWomble
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?

Beitrag von MacWomble »

Gibt es denn eine andere Lösung?
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Socke
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?

Beitrag von Socke »

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

MacWomble
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?

Beitrag von MacWomble »

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.

Ich934
Lazarusforum e. V.
Beiträge: 316
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?

Beitrag von Ich934 »

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
Tipp für PostgreSQL: www.pg-forum.de

Antworten