Einen Process "unabhängig" starten

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Einen Process "unabhängig" starten

Beitrag von corpsman »

Servus zusammen,

ich hab mir ein Tool gestartet, das auf allen Meinen Rechnern immer läuft und das für mich alle Programme die ich so nutze starte (quasi ein Nachbau der KDE Schnellstartleiste ALT+F2, nur Plattformunabhängig)

Das Kernstück des Programms ist folgender Code:

Code: Alles auswählen

Procedure TForm1.OpenApp(Filename: String);
Var
  p: TProcessUTF8;
  ep: TExecParam;
  i: Integer;
Begin
  p := TProcessUTF8.Create(Nil);
{$IFDEF WINDOWS}
  p.Options := [poDetached, poNewProcessGroup]; // das alles bringt es auch nicht ..
{$ELSE}
  p.Options := [poDetached]; // Detached scheint wohl keinen Einfluss zu haben
{$ENDIF}
  ep := SplitFilenameToExecAndParam(Filename);
  p.Executable := ep.Executable; 
  For i := 0 To high(ep.Params) Do Begin
    p.Parameters.Add(ep.Params[i]);
  End;
  Try
    p.Execute;
  Except
    On av: Exception Do Begin
      showmessage('Error on executing: ' + ep.Executable + LineEnding +
        'Error Message: ' + av.Message);
    End;
  End;
  p.free;
End; 
Mein Problem ist nun, dass alle Anwendungen die mein Programm startet "Prozesstechnisch" an meinem Program hängen, das PoDetached bringt da leider auch nichts, unter Windows das poNewProcessGroup ebenfalls nicht.

Kennt ihr einen Weg wie man die Anwendungen tatsächlich so starten kann, als habe der User darauf geklickt und ohne das z.B. der Prozess Explorer meine Anwendung als Parent anzeigt ?
--
Just try it

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Einen Process "unabhängig" starten

Beitrag von sstvmaster »

Also unter Windows funktioniert bei mir folgendes:
(Benötigt LCLBase als Package)

Code: Alles auswählen

program project1;

uses
  UTF8Process, Process;

var
  p: TProcessUTF8;

begin
  p := TProcessUTF8.Create(nil);
  p.Options := p.Options + [poDetached, poNewProcessGroup];
  p.Executable := 'Notepad.exe';
  try
    p.Execute;
  finally
    p.Free;
  end;

  ReadLn;
end.
! [poDetached, poNewProcessGroup] benötigen mind. fpc 3.2.0!
Dateianhänge
TProcess_unabhängig.zip
(1.48 KiB) 61-mal heruntergeladen
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Einen Process "unabhängig" starten

Beitrag von sstvmaster »

Nachtrag, Notepad läuft aber weiter, aber immer noch als Parent von project1.exe
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Einen Process "unabhängig" starten

Beitrag von corpsman »

:lol: damit machst du genau das gleiche wie ich auch, nur das dein try anders aussieht ..
--
Just try it

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Einen Process "unabhängig" starten

Beitrag von theo »

Die Frage ist: Warum willst du das?
Auf der bash hilft ein & hinter dem Befehl, damit die Anwendung nicht mit dem Konsolenfenster geschlossen wird, aber auch das ändert nichts daran, dass die Hierarchie ersichtlich ist. (Bild KDE Systemmonitor: Konsole hat Kwrite gestartet).

kwritebash.png
kwritebash.png (5.64 KiB) 2542 mal betrachtet

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Einen Process "unabhängig" starten

Beitrag von Winni »

Hi!

Ich schließe mich Theo an und frage: Was soll das?

Und wenn Du im Hierarchie-Baum weiter gehst, dann landest Du immer beim Kernel. Und wie willst Du ohne Kernel Deine Programme starten?

Winni

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Einen Process "unabhängig" starten

Beitrag von corpsman »

Ich hatte nun den Fall, dass eines der Programme die mein Tool startet derart Krass abgestürzt ist, das es einen Windows Bluescreen gab (mehrfach...).
Ansich ist das bei Windows ja nichts unerwartetes (nutze hier in der Firma ein Windows 10 Enterprise x64 20H2 19042.1023), was aber recht blöd war, dass die Anwendung die da gecrasht ist, anfing im Verzeichnis meiner Anwendung Crashdumps zu erstellen und dabei dann für mein Programm wichtige Configurationsdateien überschrieben wurden.

Was besonders merkwürdig ist, dass eine Datei die mein Programm geöffnet hatte den Inhalt eines dieser Crashdumps hatte, ich merkte das recht schnell als nach einen neustart meine Anwendung sehr merkwürdige Fehler brachte und ich besagte Datei weiter untersuchte...

Meine Folgerung die gecrashte Anwendung muss also irgendwie einen Weg von Sich zu meinen Logdateien gefunden haben, und daher die Idee, dass es evtl über das Prozess-Parent war (das gecrashte Programm war so ein Java Ding, ..).

Und nun könnt ihr mir erklären, dass das nichts damit zu tun hat und dann ist das auch OK für mich ;), Übrigens die Fehler in der Java anwendung waren immer Related mit ungültiger Speiucherzugriff...
--
Just try it

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: Einen Process "unabhängig" starten

Beitrag von Socke »

corpsman hat geschrieben:
Fr 2. Jul 2021, 13:33
Meine Folgerung die gecrashte Anwendung muss also irgendwie einen Weg von Sich zu meinen Logdateien gefunden haben, und daher die Idee, dass es evtl über das Prozess-Parent war (das gecrashte Programm war so ein Java Ding, ..).

Und nun könnt ihr mir erklären, dass das nichts damit zu tun hat und dann ist das auch OK für mich ;), Übrigens die Fehler in der Java anwendung waren immer Related mit ungültiger Speiucherzugriff...
Üblicherweise liegt dies mehr an dem aktuellen Verzeichnis der Anwendung. Dieses wird auch von einem Prozess an seine Kindprozesse weitergegeben - sofern nicht explizit mitgegeben.

Lösung dafür wäre:

Code: Alles auswählen

p.CurrentDirectory := 'C:\Meine\Anwendung\hat\ein\eigenens\Verzeichnis\'
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
photor
Beiträge: 443
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 2.2.6 FPC 3.2.2 (Gtk2)
CPU-Target: 64Bit

Re: Einen Process "unabhängig" starten

Beitrag von photor »

theo hat geschrieben:
Fr 2. Jul 2021, 11:06
Auf der bash hilft ein & hinter dem Befehl, damit die Anwendung nicht mit dem Konsolenfenster geschlossen wird, ....
Nebenbemerkung: das stimmt nicht ganz - wenn mich mein altertümliches Wissen nicht täuscht: Das "&" hinter einem Bash(? sh)-Befehl führt nur dazu, dass du das Eingabe-Prompt sofort wieder bekommst. Wenn die Bash geschlossen wird, reißt das die so gestartete Anwendung trotzdem mit.

Damit die Anwendung auch nach Schließen der Bash weiter rennt, braucht man "nohup <Anwendung> &" - "nohup" für "No hangup". ABER: das ist Wissen von vor 20 Jahren; da hab ich das häufiger gebraucht (starten von mehrtägigen Rechnungen auf einem zentralen Rechenknecht).

Ciao,
Photor

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Einen Process "unabhängig" starten

Beitrag von corpsman »

@Socke
Danke das baue ich auf jeden Fall mal ein, schaden kann es nicht ;)
--
Just try it

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: Einen Process "unabhängig" starten

Beitrag von Socke »

photor hat geschrieben:
Fr 2. Jul 2021, 17:46
Damit die Anwendung auch nach Schließen der Bash weiter rennt, braucht man "nohup <Anwendung> &" - "nohup" für "No hangup". ABER: das ist Wissen von vor 20 Jahren; da hab ich das häufiger gebraucht (starten von mehrtägigen Rechnungen auf einem zentralen Rechenknecht).
Da hat sich nichts geändert. Es gibt aber weitere Lösungen mit virtuellen Terminals usw.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Einen Process "unabhängig" starten

Beitrag von theo »

Socke hat geschrieben:
Fr 2. Jul 2021, 19:47
photor hat geschrieben:
Fr 2. Jul 2021, 17:46
Damit die Anwendung auch nach Schließen der Bash weiter rennt, braucht man "nohup <Anwendung> &" - "nohup" für "No hangup". ABER: das ist Wissen von vor 20 Jahren; da hab ich das häufiger gebraucht (starten von mehrtägigen Rechnungen auf einem zentralen Rechenknecht).
Da hat sich nichts geändert. Es gibt aber weitere Lösungen mit virtuellen Terminals usw.
Also hier auf KDE ist es so, dass im obigen Beispiel KWrite (Ein GUI Programm) weiterläuft, wenn es mit & gestartet und das Konsole Fenster geschlossen wird.
Wenn ich ohne & ausführe, meldet sich KDE beim Schliessen von Konsole mit "In diesem Fenster wird noch ein Prozess ausgeführt. Möchten Sie dennoch beenden?*
Bei "JA" reisst es Kwrite mit.

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Einen Process "unabhängig" starten

Beitrag von Soner »

Unter Windows kannst du ShellExecute verwenden:
ShellExecute(0,nil, 'C:\Windows\notepad.exe','',nil,1);

Für Linux musst du ähnliches verwenden. Gab es dort nicht fork-Funktion.

Edit:
Für Linux scheint exec richtige Funktion zu sein:
linux_unix_programmierung

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Einen Process "unabhängig" starten

Beitrag von PascalDragon »

fork zweigt einen neuen Kindprozess ab, exec lädt die angegebene Binary in den aktuellen Prozess. Das heißt das Starten eines neues Prozesses läuft im Normalfall auf fork & exec heraus. Was anderes gibt es einfach nicht (also nicht wie bei Windows mit ShellExecute und CreateProcess, wobei ersteres auch nur ein Fancy Wrapper um CreateProcess ist (*)). Und TProcess nutzt eben genau fork & exec wie es sein muss.

(*) okay, es gibt noch system, aber intern ist das letztlich auch nur ein Wrapper um fork & exec wie ShellExecute um CreateProcess.
FPC Compiler Entwickler

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Einen Process "unabhängig" starten

Beitrag von corpsman »

Also ich habe nun den CurrentDir ansatz implementiert und die "zerstörten" dateien in mein bakup System mit aufgenommen. Ich nutze das Programm seit > 3 Jahren und das war der erste Crash der so krass war. Wenn das nun wieder 3 Jahre Dauert bis zum nächsten und dann meine Bakup strategie aufgeht, ist das in Summe der geringere Aufwand ;)

Danke für die regen Diskussionen..
--
Just try it

Antworten