Raspbian Shellscript asynchron ausführen

Für sonstige Unterhaltungen, welche nicht direkt mit Lazarus zu tun haben
Antworten
Thandor
Beiträge: 153
Registriert: Sa 30. Jan 2010, 18:17
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
CPU-Target: 64Bit
Wohnort: Berlin

Raspbian Shellscript asynchron ausführen

Beitrag von Thandor »

Hallo,

habe ein Problem. Ich möchte in meinem Programm eine Update-Funktion einführen (also Versionsupdate). Dazu habe ich mir ein Shell-Skript geschrieben.

update_ex.sh

Code: Alles auswählen

 
#!/bin/bash
 
echo "updating the CashDesk-System please wait"
 
pid=$1
source=$2
destination=$3
 
# waitin for closeing the CashDesk-System
echo "wait for closeing the CashDesk-System"
while kill -0 $pid 2> /dev/null; do sleep 1; done;
 
# Extract and install update
tar -xf $source -C $destination
 
# Restart the CashDesk-System
reboot now
 
echo "done"
 


Aus Testzwecken habe ich ein weitere kleines Skript geschrieben, welches dann von meinem Programm aufgerufen wird.

update.sh

Code: Alles auswählen

 
#!/bin/bash
 
echo "starting update"
echo "./update_ex.sh $1 $2 $3"
 
./update_ex.sh $1 $2 $3 &
 
exit 0
 
 


Aufrufen tue ich das Skript so:

Code: Alles auswählen

 
CmdResponse := '';
        if not RunCommand(
          'sudo',
          ['./update.sh', IntToStr(pid), source, AppDir],
          CmdResponse
        ) then begin
          ShowMessage(CmdResponse);
        end else Application.Terminate;   
 


leider bleibt das Programm hängen, da das Skript irgendwie nicht asynchron ausgeführt wird.
Was mach ich falsch?

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Raspbian Shellscript asynchron ausführen

Beitrag von Warf »

Runcommand wartet bis der Ausgeführte Prozess fertig ist um dann die Ausgabe des Prozesses (In STDOut) in die übergebene Variable zu lesen. Verwende lieber TProcess

Thandor
Beiträge: 153
Registriert: Sa 30. Jan 2010, 18:17
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
CPU-Target: 64Bit
Wohnort: Berlin

Re: Raspbian Shellscript asynchron ausführen

Beitrag von Thandor »

Danke für deine Antwort.

Ich habe es jetzt so gemacht:

Code: Alles auswählen

 
Process := TProcess.create(nil);
Process.CommandLine := 'sudo ./update.sh ' + IntToStr(pid) + ' ' + source + ' ' + AppDir;
Process.Execute;
Application.Terminate;                   
 


leider wird mein Script anscheinend nicht ausgeführt. Oder habe ich bei der Verwendung von TProcess etwas übersehen?

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Raspbian Shellscript asynchron ausführen

Beitrag von Warf »

Denk mal drüber nach was das macht. Das OS führt das Programm sudo aus mit den Parametern './update.sh ' + IntToStr(pid) + ' ' + source + ' ' + AppDir. Sudo wiederum ist ein Programm was zu allererst einmal ein Passwort über STDIn liest. Das heißt du startest das Programm sudo, sudo wartet auf eine Eingabe, du beendest dein Programm ohne sudo ein Passwort zu übergeben. Sudo wartet halt bis der Prozess gekillt wird (spätestens also beim Logout) auf eine Eingabe die niemals kommen wird.

Thandor
Beiträge: 153
Registriert: Sa 30. Jan 2010, 18:17
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
CPU-Target: 64Bit
Wohnort: Berlin

Re: Raspbian Shellscript asynchron ausführen

Beitrag von Thandor »

Also mit RunCommand lief ja das Script mit sudo ohne dass ich ein Passwort mitgeben musste, es hat halt aber das Programm blockiert, weil das Skript wartet, bis das Programm beendet wird. Schieße ich das Programm mit "kill" ab lief das Skript durch.

Außerdem musste ich bei Raspbian noch nie ein Sudo-Passwort eingeben. Würde mich also wundern, warum nun auf einmal ein Passwort nötig ist.

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Raspbian Shellscript asynchron ausführen

Beitrag von Warf »

Thandor hat geschrieben:Also mit RunCommand lief ja das Script mit sudo ohne dass ich ein Passwort mitgeben musste, es hat halt aber das Programm blockiert, weil das Skript wartet, bis das Programm beendet wird. Schieße ich das Programm mit "kill" ab lief das Skript durch.

Außerdem musste ich bei Raspbian noch nie ein Sudo-Passwort eingeben. Würde mich also wundern, warum nun auf einmal ein Passwort nötig ist.


Dann hast du eine recht seltsame konfiguration, auf meinem pi muss ich immer mein Passwort angeben. Aber wenn man sich mal die Funktion RunCommand ansieht macht diese auch nichts anderes als einen TProcess zu erstellen und laufen zu lassen:

Code: Alles auswählen

 
Var
    p : TProcess;
    exitstatus : integer;
    ErrorString : String;
begin
  p:=TProcess.create(nil);
  p.setcommandline(cmdline);
  result:=internalruncommand(p,outputstring,errorstring,exitstatus)=0;
  if exitstatus<>0 then result:=false;


Wobei du das internalruncommand einfach durch p.Execute; und anschließendem p.Free; ersetzen kannst.
Du könntest mal einen Blick auf die Optionen werfen, aber am sonsten sehe ich (bis auf das fehlende Free) keinen Fehler

Versuche eventuell mal das CurrentDirectory zu setzen (hilft bei relativen pfaden häufig) oder den Pfad zum sudo anzugeben

Thandor
Beiträge: 153
Registriert: Sa 30. Jan 2010, 18:17
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
CPU-Target: 64Bit
Wohnort: Berlin

Re: Raspbian Shellscript asynchron ausführen

Beitrag von Thandor »

Was ich nicht verstehe ist, warum es mit RunCommand nicht funktioniert

Code: Alles auswählen

 
    #!/bin/bash
 
    echo "starting update"
    echo "./update_ex.sh $1 $2 $3"
 
    ./update_ex.sh $1 $2 $3 &
 
    exit 0
 


Das & bei "./update_ex.sh $1 $2 $3 &" soll doch dafür sorgen, dass "update_ex.sh" asynchron ausgeführt wird, also müsste sich doch update.sh beenden, auch wenn in update_ex.sh auf das Beenden des Programms gewartet wird.
Wenn ich es manuell ausführe funktioniert es.

Thandor
Beiträge: 153
Registriert: Sa 30. Jan 2010, 18:17
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
CPU-Target: 64Bit
Wohnort: Berlin

Re: Raspbian Shellscript asynchron ausführen

Beitrag von Thandor »

So ich habe es jetzt fast hinbekommen...

Code: Alles auswählen

 
Process := TProcess.create(nil);
Process.CommandLine := 'sudo ./update.sh ' + IntToStr(pid) + ' ' + source + ' ' + AppDir;
Process.Options := Process.Options + [poNewConsole];
Process.ShowWindow := swoMaximize;
Process.Execute;
Process.Free;
Application.Terminate;
 

Ich habe den Process so eingestellt, dass ich eine Konsole bekomme. Dabei ist mir folgendes aufgefallen:
Wenn ich das Programm über "Autostart" (.desktop) starten lasse, dann blinkt das Konsolenfenster kurz auf und es passiert nichts.
Wenn ich aber das Programm manuell starte läuft das Skript sauber durch.

meine .Desktop:
/home/pi/.config/autostart/kasse.desktop

Code: Alles auswählen

 
[Desktop Entry]
Name="Kasse"
Comment="simple Cashdesk"
Type=Application
Exec=/home/pi/Projekte/Kasse/Registrierkasse
 

wo ist hier der Unterschied zwischen der .desktop und dem manuellen Starten?

Thandor
Beiträge: 153
Registriert: Sa 30. Jan 2010, 18:17
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
CPU-Target: 64Bit
Wohnort: Berlin

Re: Raspbian Shellscript asynchron ausführen

Beitrag von Thandor »

Hat sich erledigt.

hatte die Frage hier noch parallel gestellt.

Es lag an den relativen Pfad bei "./update.sh"

Benutzeravatar
Garfield
Beiträge: 172
Registriert: Do 5. Jun 2008, 22:07
OS, Lazarus, FPC: Ubuntu 22.04 LTS (Laz 3.0 FPC3.2.2)
CPU-Target: 64Bit
Wohnort: Aken

Re: Raspbian Shellscript asynchron ausführen

Beitrag von Garfield »

Warf hat geschrieben:Dann hast du eine recht seltsame konfiguration, auf meinem pi muss ich immer mein Passwort angeben. ...

Ich benutze das aktuelle Raspbian Jessie mit Pixel vom Januar 2017. Da habe ich auch kein Passwort eingeben müssen.
Gruß Garfield

Antworten