Kontrolle über mehrere Programme
- af0815
- Lazarusforum e. V.
- Beiträge: 6858
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Kontrolle über mehrere Programme
Ich möchte mehere GUI Programme parallel laufen lassen, die von einem Programm gestartet und überwacht werden. Falls ein Programm muckt, so will ich es abschiessen und neu starten.
Entwickeln will ich 2 Programme - ersten den MCP (Tron lässt grüßen) und dann die die Arbeitsapp die halt X-mal aufgerufen wird (ca. 7 mal parallel). Die Arbeitsapp selbst senden einen "I'm alive" und eine Kennung an den MCP. Das ist alles kein Problem, nur wie starte ich die zB. 7 Prozesse parallel aus Lazarus heraus, ohne das der MCP blockiert wird ?
Entwickeln will ich 2 Programme - ersten den MCP (Tron lässt grüßen) und dann die die Arbeitsapp die halt X-mal aufgerufen wird (ca. 7 mal parallel). Die Arbeitsapp selbst senden einen "I'm alive" und eine Kennung an den MCP. Das ist alles kein Problem, nur wie starte ich die zB. 7 Prozesse parallel aus Lazarus heraus, ohne das der MCP blockiert wird ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 1097
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
Re: Kontrolle über mehrere Programme
Nachdem ich kein Crack bei Netzwerkkommunikation bin, habe ich so etwas ähnliches mit Hilfe der ohnedies mit eingebundenen Datenbank gemacht.
Jedes Programm meldet sich an der DB an, schreibt eine Art Log in eine Tabelle der DB und schreibt dabei auch seine Kennungen (IP, Fenster-ID und was man sonst noch braucht) mit in die DB (war damals nur eine Tabelle).
Entweder wurde das 'Alive' vom Programm in einer Schleife erledigt oder ggfs auch mal mit einem Timer.
Der MCP hat aufgrund von Daten in der Tabelle die Situation dann sichtbar genacht. Bei so wenigen Datensätzen geht das performant. Habe oft auf diese Weise 20+ Rechner überwacht. Zeitmessungen und warten aufs nächste Alive oder Auswertungen von Joblaufzeiten sind dabei auch denkbar.
Das Programm hatte auch ein "Startprogramm" welches das eigentliche Programm gestartet, überwacht und ggfs neu gestartet hat.
So musste der MPC nur den einen Programmprozess killen der ggfs Mucken gemacht hat, den Rest hat das Startprogramm erledigt.
Jedes Programm meldet sich an der DB an, schreibt eine Art Log in eine Tabelle der DB und schreibt dabei auch seine Kennungen (IP, Fenster-ID und was man sonst noch braucht) mit in die DB (war damals nur eine Tabelle).
Entweder wurde das 'Alive' vom Programm in einer Schleife erledigt oder ggfs auch mal mit einem Timer.
Der MCP hat aufgrund von Daten in der Tabelle die Situation dann sichtbar genacht. Bei so wenigen Datensätzen geht das performant. Habe oft auf diese Weise 20+ Rechner überwacht. Zeitmessungen und warten aufs nächste Alive oder Auswertungen von Joblaufzeiten sind dabei auch denkbar.
Das Programm hatte auch ein "Startprogramm" welches das eigentliche Programm gestartet, überwacht und ggfs neu gestartet hat.
So musste der MPC nur den einen Programmprozess killen der ggfs Mucken gemacht hat, den Rest hat das Startprogramm erledigt.
- af0815
- Lazarusforum e. V.
- Beiträge: 6858
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Kontrolle über mehrere Programme
Der Sync/Watchdog ist das einfachste für mich, ich verwende laufend das S7-Protokoll und auch aus dem SNAP7 Projekt die entsprechenden Server. Damit belaste ich keine DB und brauche auch kein direktes polling. Das erledigen die super Komponeneten voncharlytango hat geschrieben: Fr 26. Apr 2024, 12:32 Nachdem ich kein Crack bei Netzwerkkommunikation bin, habe ich so etwas ähnliches mit Hilfe der ohnedies mit eingebundenen Datenbank gemacht.
PascalSCADA Projekt. Damit kann man super IPC betreiben, wenn man weis was man tut

Ich habe Probleme ander Programm sicher zu starten ohne das der startende Prozess stehen bleibt und wartet. Nur dort liegt mein (geistiges) Problem.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 18
- Registriert: Mo 8. Apr 2013, 17:12
- OS, Lazarus, FPC: Win11, Debian 12.5, Lazarus: 2.2.6, FPC: 3.2.2
- CPU-Target: 64Bit
Re: Kontrolle über mehrere Programme
Moin.
In der Hoffnung dich richtig verstanden zu haben.
Damit starte ich meinen Sql-Server im Hintergrund, ohne das meine Hauptanwendung blockiert.
In der Hoffnung dich richtig verstanden zu haben.
Damit starte ich meinen Sql-Server im Hintergrund, ohne das meine Hauptanwendung blockiert.
Code: Alles auswählen
procedure TForm1.Button_StartClick(Sender: TObject);
var
exe : TProcess;
begin
exe := TProcess.Create(nil);
exe.Executable:='maria2\bin\mysqld.exe';
exe.Parameters.Add('--pid_file=sevrer.pid --no-defaults --console'); // MaraiDB! 10.4.12
exe.Options := exe.Options + [poNoConsole];
exe.Execute;
exe.Free;
end;
Re: Kontrolle über mehrere Programme
Ist Multithreading eine Alternative?
- af0815
- Lazarusforum e. V.
- Beiträge: 6858
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Kontrolle über mehrere Programme
Nein, das Programm ist Multithreading, schmeisst aber von Zeit zu Zeit eine Fehlermeldung aus den Tiefen von LCL oder FCL. Und das blöde Fenster blockiert scheinbar den Haupttask. Und ausgerechnet der Teilt die Resourcen zu. Jetzt will ich aus den Tasks einzelne Programme machen, die ich auch überwachen kann. Ist einer blockiert -> abschuss und neu starten. Es gibt kein wirkliches Muster, nur die Prozesse müssen einfach arbeiten.
Es kann sich auch um eine race condition zwischen den Task um Systemresourcen handeln. Nur es lässt sich weder Debuggen, noch kann ich die richtige Stelle ausmachen. Das ganze Exceptionhandling wird da ausgehebelt. Normalerweise sollte das ja das ganze abfangen, nur hier nicht. Und es ist nur in produktiver Umgebung zu beobachten. Und läuft in etwas kleinerer Version (weniger Threads) bombenstabil seit Jahren.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 1097
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
Re: Kontrolle über mehrere Programme
Wir hatten da mal eine Multithreaded Anwendung laufen, die für jede angeforderte Netzwerkverbindung einen eigenen Task(also einen eigenen Programmstart) angeworfen hat. Das war damals noch in Kylix. Aber soweit ich mich erinnere, hat sich das Betriebssystem und eine Art Load-Balancer auf OS-Ebene darum gekümmert dass blockierte oder eingefrorenen Tasks gekillt und neu gestartet wurden.
Nicht sehr hilfreich mit der wenigen Info, ich weiß -- aber vielleicht bringt dich das auf die Spur etwas im Betriebssystem zu suchen.
Nicht sehr hilfreich mit der wenigen Info, ich weiß -- aber vielleicht bringt dich das auf die Spur etwas im Betriebssystem zu suchen.
Re: Kontrolle über mehrere Programme
Einfach ein script ansteuern, welches das programm neu startet?
unter linux kannst du dir ja aussuchen, wie du es starten möchtest, sollte in Win ebenso funktionieren.
mir fallen hier spontan diese ein:
vorher das alte noch killen, ich sprech hier aus erfahrung 
unter linux kannst du dir ja aussuchen, wie du es starten möchtest, sollte in Win ebenso funktionieren.
mir fallen hier spontan diese ein:
Code: Alles auswählen
exec /././app
sh -c /././app
/././app
/././app 2>&1 &
nohup /././app &

- af0815
- Lazarusforum e. V.
- Beiträge: 6858
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Kontrolle über mehrere Programme
Vorweg, das ganze wird Linux (Debian) only.schoschy hat geschrieben: Mi 8. Mai 2024, 06:05 Einfach ein script ansteuern, welches das programm neu startet?
...
vorher das alte noch killen, ich sprech hier aus erfahrung![]()
Dazu muss ich einmal den PID vom hängenden Programm wissen, damit ich es "kill"en kann. Das heißt ich brauche die Informationen: Zuordnung zur SPS -> gestartetes Programm (Zuordnung SPS ist Aufrufparameter)-> PID. Dann kann ich es überwachen und wenn es sich bei der SPS nicht aktiv meldet, über den PID abschießen und neu starten (neuen PID in Erfahrung bringen).
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
Re: Kontrolle über mehrere Programme
bei linux bin ich immer der Meinung, dass auf boardmittel zurückgegriffen werden kann.
ps in grep rein um die PID zu erhalten. Wenn du mehrere prozesse hast, eventuell noch nach Startparametern greppen.
Aus einem programm aufgerufen, kommt über stdIO ja die Zeile der Begierde (oder eben nicht, wenn es komplett weg ist).
Die Überprüfung, ob der Prozess noch richtig läuft, kannst du nur selbst definieren.
hab gerade kein Debian zur verfügung, eventuell muss die ausgabe aber noch gefiltert werden.
ps in grep rein um die PID zu erhalten. Wenn du mehrere prozesse hast, eventuell noch nach Startparametern greppen.
Aus einem programm aufgerufen, kommt über stdIO ja die Zeile der Begierde (oder eben nicht, wenn es komplett weg ist).
- ps -ax | grep <programmname> | grep <startparameter>
- Kill (skip)
- restart
Die Überprüfung, ob der Prozess noch richtig läuft, kannst du nur selbst definieren.
Code: Alles auswählen
ps -ax |grep mosquitto
581 ? Ss 11:45 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf
15979 pts/0 S+ 0:00 grep --color=auto mosquitto
- af0815
- Lazarusforum e. V.
- Beiträge: 6858
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Kontrolle über mehrere Programme
Ich bin aktuell durch ein paar Ideen daraufgekommen, das ich die Schritte die ich benötige ohne die LCL und damit die Bindung an ein Widgetset mache. Da bin ich jetzt gerade dabei das zu schreiben und testeten.
Das mit "ps" und der Kommandozeile (dank @schoschy und die anderen) ist für mich dann erst Plan B.
Zusätzlich könnte es sein, das die Meldung auch davon her rührt, das der "ftpd" die Datei noch nicht ganz "losgelassen" hat. Es wird ja ein Bild von einer Einheit per FTP auf den Debian geladen und dieses Bild wird kurz nachgearbeitet und an den endgültigen Ort weiterkopiert per FTP. Und da könnte es hin und wieder für kurze Zeit ein überschneiden der Zugriffe, selten aber doch, geben.
Wie kann man unter Linux sowas beherrschen. Ich mache es aktuell mit einer Zeitstempelabfrage, wann das Bild erstellt wurde plus einer Sicherheitszeit und greife dann zu. Das dürfte aber manchmal nicht ganz funktionieren.
Das mit "ps" und der Kommandozeile (dank @schoschy und die anderen) ist für mich dann erst Plan B.
Zusätzlich könnte es sein, das die Meldung auch davon her rührt, das der "ftpd" die Datei noch nicht ganz "losgelassen" hat. Es wird ja ein Bild von einer Einheit per FTP auf den Debian geladen und dieses Bild wird kurz nachgearbeitet und an den endgültigen Ort weiterkopiert per FTP. Und da könnte es hin und wieder für kurze Zeit ein überschneiden der Zugriffe, selten aber doch, geben.
Wie kann man unter Linux sowas beherrschen. Ich mache es aktuell mit einer Zeitstempelabfrage, wann das Bild erstellt wurde plus einer Sicherheitszeit und greife dann zu. Das dürfte aber manchmal nicht ganz funktionieren.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).