Raspbian Shellscript asynchron ausführen

Für sonstige Unterhaltungen, welche nicht direkt mit Lazarus zu tun haben

Raspbian Shellscript asynchron ausführen

Beitragvon Thandor » 6. Feb 2017, 18:10 Raspbian Shellscript asynchron ausführen

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?
Thandor
 
Beiträge: 112
Registriert: 30. Jan 2010, 18:17
Wohnort: Berlin
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 1.6 mit FPC 3.0.0 (32Bit) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Warf » 6. Feb 2017, 18:48 Re: Raspbian Shellscript asynchron ausführen

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
Warf
 
Beiträge: 738
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon Thandor » 6. Feb 2017, 19:17 Re: Raspbian Shellscript asynchron ausführen

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?
Thandor
 
Beiträge: 112
Registriert: 30. Jan 2010, 18:17
Wohnort: Berlin
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 1.6 mit FPC 3.0.0 (32Bit) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Warf » 6. Feb 2017, 19:32 Re: Raspbian Shellscript asynchron ausführen

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.
Warf
 
Beiträge: 738
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon Thandor » 6. Feb 2017, 19:46 Re: Raspbian Shellscript asynchron ausführen

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.
Thandor
 
Beiträge: 112
Registriert: 30. Jan 2010, 18:17
Wohnort: Berlin
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 1.6 mit FPC 3.0.0 (32Bit) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Warf » 6. Feb 2017, 20:11 Re: Raspbian Shellscript asynchron ausführen

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
Warf
 
Beiträge: 738
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon Thandor » 6. Feb 2017, 20:24 Re: Raspbian Shellscript asynchron ausführen

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: 112
Registriert: 30. Jan 2010, 18:17
Wohnort: Berlin
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 1.6 mit FPC 3.0.0 (32Bit) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Thandor » 6. Feb 2017, 22:09 Re: Raspbian Shellscript asynchron ausführen

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: 112
Registriert: 30. Jan 2010, 18:17
Wohnort: Berlin
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 1.6 mit FPC 3.0.0 (32Bit) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Thandor » 6. Feb 2017, 22:55 Re: Raspbian Shellscript asynchron ausführen

Hat sich erledigt.

hatte die Frage hier noch parallel gestellt.

Es lag an den relativen Pfad bei "./update.sh"
Thandor
 
Beiträge: 112
Registriert: 30. Jan 2010, 18:17
Wohnort: Berlin
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 1.6 mit FPC 3.0.0 (32Bit) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Garfield » 14. Feb 2017, 19:48 Re: Raspbian Shellscript asynchron ausführen

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
Garfield
 
Beiträge: 136
Registriert: 5. Jun 2008, 21:07
Wohnort: Aken
OS, Lazarus, FPC: Win10/Ubuntu16.04 L1.6 FPC3.0.0 | 
CPU-Target: 64Bit
Nach oben

• Themenende •

Zurück zu Dies und Das



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

porpoises-institution
accuracy-worried