Lazarus Anwendung über Script kontrolliert beenden [gelöst]

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:

Lazarus Anwendung über Script kontrolliert beenden [gelöst]

Beitrag von corpsman »

Servus zusammen,

ich bastle mir gerade eine kleine Anwendung für unseren neuen Heim Raspi.

Nun will ich diese Anwendung [Eine GUI Anwendung die Vollbild zu sehen ist] via Script Aktualisieren und dann neu starten.

Dazu sind 3 Dinge Notwendig
1. Anwendung sauber beenden
2. Anwendung neu compilieren
3. Raspi neu starten.

2 und 3 sind kein Problem, das mache ich mittels 2 Bash Scripten:

Das Script dass ich auf meinem PC Starte

Code: Alles auswählen

#!/bin/bash
clear
echo
echo Dieses Skript aktualisiert das HA Project auf dem Raspberry Pi
echo Vorher müssen aber alle Änderungen im SVN eingecheckt sein
echo und der Raspi muss eingeschaltet sein.
echo
echo Weiter mit Return, zum abbrechen CTRG+C
echo
# Warten bis User mit Return bestätigt, ihm die Möglichkeit geben
# ab zu brechen.
read CMD;
echo Auf dem Raspi einloggen
echo Bitte Password eingeben:
ssh corpsman@192.168.168.38 'bash -s' < __0_do_not_run_me_manual.sh
echo
echo Fertig.
# Warten bis User mit Return bestätigt, ihm die Möglichkeit geben
# ab zu brechen.
read CMD;
Das Script das ich im 1. Script übergebe:

Code: Alles auswählen

#!/bin/bash
clear
echo
echo Update SVN
echo
cd Projects
svn revert -R ./  
svn update
echo
echo compile ha
echo 
cd Hausautomatisierung
/home/corpsman/lazarus/lazbuild -B ha.lpi
# nicht schön aber geht, durch den Neustart wird dann auch ha neu gestartet
sudo reboot
cd ..
cd ..
echo
echo Finished
echo
Mein Problem ist nun der 1. Punkt

Klar kann ich mit

Code: Alles auswählen

killall -9 ha
mein Programm abschiesen und gut ist.

Mein Problem ist nun aber, dass mein ha Programm beim Beenden eigentlich noch Logdaten schreiben sollte, und das würde dann nicht passieren. Aktuell beende ich immer die App von hand über das touch display.

Die Frage ist also, wie kann ich aus einer Konsole heraus meinem Programm mitteilen, dass es sich kontrolliert beenden soll und in dem Script dann warten bis das Programm beendet ist ?
Zuletzt geändert von corpsman am Sa 30. Apr 2022, 15:51, insgesamt 1-mal geändert.
--
Just try it

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

Re: Lazarus Anwendung über Script kontrolliert beenden

Beitrag von theo »

Hilft dir das weiter?
viewtopic.php?p=125464#p125464

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Lazarus Anwendung über Script kontrolliert beenden

Beitrag von m.fuchs »

Code: Alles auswählen

program killme;
{$MODE ObjFpc}
{$H+}

uses
  Classes, SysUtils, BaseUnix;

procedure DoKill(Signal: CInt); cdecl;
begin
  if Signal = SIGTERM then begin
    WriteLn('Laden');
    WriteLn('Spannen');
    WriteLn('Anlegen');
    WriteLn('Warten...');
    WriteLn('Abdrücken');
    Halt;
  end;
end;

procedure InstallSigHandler;
var
  Action: PSigActionRec;
begin
  New(Action);
  Action^.sa_handler := SigActionHandler(@DoKill);
  FillChar(Action^.sa_mask, SizeOf(Action^.sa_mask), #0);
  Action^.sa_flags := 0;
  Action^.sa_restorer := nil;
  if FPSigaction(SIGTERM, Action, nil) <> 0 then begin
    WriteLn('Error: ', fpgeterrno);
    Halt(1);
  end;
end;


begin
  InstallSigHandler;
  WriteLn('Rumsitzen und abwarten...');
  WriteLn('Drücke Enter wenn ich gehen soll oder sende mir ein SIGTERM.');
  ReadLn;
end.
Ein

Code: Alles auswählen

kill PID
oder

Code: Alles auswählen

killall PROZESSNAME
- also ohne -9 - sorgt dann dafür dass die DoKill-Methode aufgerufen wird.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
lcb-User
Beiträge: 54
Registriert: Di 15. Jul 2014, 13:18
OS, Lazarus, FPC: Linux Mint 21.1 Cinnamon Lazarus 2.3.0 (rev main-2_3-3744-g967034aff5) FPC 3.3.1
CPU-Target: 64Bit
Wohnort: München

Re: Lazarus Anwendung über Script kontrolliert beenden

Beitrag von lcb-User »

Hallo corpsman
corpsman hat geschrieben:
Sa 30. Apr 2022, 11:29

Mein Problem ist nun aber, dass mein ha Programm beim Beenden eigentlich noch Logdaten schreiben sollte, und das würde dann nicht passieren. Aktuell beende ich immer die App von hand über das touch display.

Die Frage ist also, wie kann ich aus einer Konsole heraus meinem Programm mitteilen, dass es sich kontrolliert beenden soll und in dem Script dann warten bis das Programm beendet ist ?
Wenn ich das richtig verstanden habe würde ich
UniqueInstance auf das Formular legen und auf einen Parameter reagieren.

https://wiki.freepascal.org/UniqueInstance/de

Also einfach das Programm nochmal aufrufen und eben den besagten Parameter mitgeben.

LG
Sonnige Grüße
Bibsi


Traue keiner Statistik die du nicht selbst gefälscht hast (Sir Winston Churchill 1874 - 1965)
Linux Mint 21.1 Cinnamon 5.6.7 Kernel 5.19.0-35-generic
Lazarus 2.3.0 (rev main-2_3-3744-g967034aff5) FPC 3.3.1 x86_64-linux-gtk2

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: Lazarus Anwendung über Script kontrolliert beenden

Beitrag von corpsman »

@lcb-User
Deine Lösung mag sicher gehen, doch irgendwie erscheint mir diese nicht "sauber"

@m.fuchs
Deine Lösung hat mir gleich gefallen und hab sie nun mal getestet und das Speicherloch noch ausgebaut, danke.

Code: Alles auswählen

{$IFDEF LINUX}

Var
  Action: PSigActionRec; // Global, damit es in DoKill auch wieder freigegben werden kann.

Procedure DoKill(Signal: CInt); cdecl;
Begin
  If Signal = SIGTERM Then Begin
    writeln('Going down through sigkill..');
    Dispose(Action);
    form1.Close; // Form Close ruft dann das Speichern auf und macht feierabend ;)
  End;
End;

Procedure InstallSigHandler;
Begin
  New(Action);
  Action^.sa_handler := SigActionHandler(@DoKill);
  FillChar(Action^.sa_mask, SizeOf(Action^.sa_mask), #0);
  Action^.sa_flags := 0;
  Action^.sa_restorer := Nil;
  If FPSigaction(SIGTERM, Action, Nil) <> 0 Then Begin
    WriteLn('Error: ', fpgeterrno);
    Halt(1);
  End;
End;
{$ENDIF}

Begin
{$IFDEF LINUX}
  InstallSigHandler;
{$ENDIF}   
--
Just try it

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: Lazarus Anwendung über Script kontrolliert beenden [gelöst]

Beitrag von corpsman »

Ach mein neues "onPi" scipt mit fehlerhandling, falls noch jemand nach Vorlagen sucht ;)

Code: Alles auswählen

#!/bin/bash
clear
echo
echo Update SVN
echo

# die laufende Anwendung sauber runter fahren
killall ha

# den neuen Code auschecken
cd Projects
svn revert -R ./  
svn update
echo
echo compile ha
echo 
cd Hausautomatisierung

# Das ganze bauen
/home/corpsman/lazarus/lazbuild -B ha.lpi

# hat das bauen geklappt ?, dann neu starten, sonst halten
if [ -f ha ]; then
sudo reboot
fi

# hier kommen wir nu an wenn obige if nicht greift
# also kann man hier die Fehlermeldung plazieren ;)
echo
echo Finished with errors, please double check.
echo

--
Just try it

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Lazarus Anwendung über Script kontrolliert beenden

Beitrag von m.fuchs »

corpsman hat geschrieben:
Sa 30. Apr 2022, 15:51
@m.fuchs
Deine Lösung hat mir gleich gefallen und hab sie nun mal getestet und das Speicherloch noch ausgebaut, danke.
Ja sorry, da fehlte noch ein

Code: Alles auswählen

Dispose(Action);
am Ende von InstallSigHandler.

Eine globale Variable ist meiner Meinung nach nicht nötig, da der Record an den Linux-Kernel übergeben wird, der nur den Pointer auf die Methode an die das Signal gesendet wird speichert und danach der Record nicht mehr benötigt wird.
Leute mit Expertenwissen zu Linux dürfen mich gerne korrigieren. Funktioniert hat es bisher jedenfalls so.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

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: Lazarus Anwendung über Script kontrolliert beenden [gelöst]

Beitrag von corpsman »

*g*

Danke für die Klarstellung, wie das alles zusammenspielt war mir nicht wirklich klar. Ich fixe das bei mir noch.
--
Just try it

Antworten