Forum: PC-Programmierung Raspberry Autostart funktioniert nicht richtig.


von Thorsten (Gast)


Lesenswert?

Hallo,

ich benutze glabels um Etiketten vom Raspberry zu drucken.

Ich habe ein "skript" geschrieben mit folgendem Inhalt

glabelsstart.sh
1
echo "hallo"
2
glabels-3 /home/pi/Desktop/Standard.glabels

Führe ich das Skript aus mit ./etc/init.d/glabelsstart.sh startet das 
Program und läd die richtige Datei.

Ich habe das dann mit
sudo update-rc.d glabelsstart.sh defaults
in den Autostart verschoben. Das Skript startet das Program, läd aber 
die Datei nicht.

Woran könnte dies liegen? muss ich in ein bestimmtes verzeichnis 
wechseln oder so?

LG
Thorsten

Beitrag #6589454 wurde vom Autor gelöscht.
von Heiner (Gast)


Lesenswert?

Diverse Probleme:

Thorsten schrieb:
> Ich habe ein "skript" geschrieben mit folgendem Inhalt

Es ist gute Sitte, Skripte mit einem passenden Shebang zu beginnen. Auch 
wenn das nicht immer im engeren Sinn erforderlich ist (und hier 
wahrscheinlich eher nicht), ist es doch eine gute Klarstellung, was der 
folgende Text bedeuten soll.

Thorsten schrieb:
> Führe ich das Skript aus mit ./etc/init.d/glabelsstart.sh

Kleinigkeit: Den führenden Punkt brauchst du hier nicht. Der wäre nur 
erforderlich, wenn du bereits in /etc/init.d/ bist und dort das Skript 
aufrufen wolltest.

Thorsten schrieb:
> Ich habe das dann mit
> sudo update-rc.d glabelsstart.sh defaults
> in den Autostart verschoben.

Das willst du nicht tun. Das sind weder die richtigen Benutzerrechte 
noch ist es der richtige Zeitpunkt für eine grafische Anwendung. 
Außerdem erfordert der default-Parameter (wenn man das schon so machen 
möchte) einen LSB-Header dieser Art:

https://wiki.debian.org/LSBInitScripts

Die Information, wann das Ding gestartet werden soll, fällt ja nicht vom 
Himmel ...

Insgesamt ist das aber der falsche Mechanismus. Für deinen Fall wäre ein 
Start mit der Desktop-Session sinnvoller, bei einem üblichen Raspberry 
OS wäre das LXDE (und auch sonst wahrscheinlich etwas XDG-kompatibles) 
und damit ist die bessere Methode, eine .desktop-Datei passenden Inhalts 
in /home/pi/.config/autostart (für den Benutzer pi) oder in 
/etc/xdg/autostart (für alle Benutzer) zu packen.

Man könnte auch die lxsession-Konfiguration anpassen, dann spart man 
sich die .desktop-Datei:

https://www.raspberrypi-spy.co.uk/2014/05/how-to-autostart-apps-in-rasbian-lxde-desktop/

Dieser Ansatz ist spezifisch für LXDE, während der andere Ansatz u.a. 
auch für gnome passen würde.

Thorsten schrieb:
> muss ich in ein bestimmtes verzeichnis
> wechseln oder so?

Ein schneller Versuch mit glabels hat bei mir nicht diesen Eindruck 
erweckt, aber es kann nicht schaden, in das Verzeichnis zu wechseln, in 
dem die Datei liegt, die geöffnet werden soll. Ich habe aber das Gefühl, 
dass schon die vorherigen Hinweise das Problem lösen werden ...

von Thorsten (Gast)


Lesenswert?

Hallo,

vielen lieben Dank für deine Antwort.

Ich greife Remote auf den Raspberry zu und möchte, dass wenn ich "per 
Remote" komme schon möglichst alles fertig gestartet ist.

Ich wusste nicht dass das so falsch ist, ich schau mir deine Punkte in 
Ruhe an. Schon mal vielen lieben Dank!!!

von Sheeva P. (sheevaplug)


Lesenswert?

Heiner schrieb:
> Thorsten schrieb:
>> Führe ich das Skript aus mit ./etc/init.d/glabelsstart.sh
>
> Kleinigkeit: Den führenden Punkt brauchst du hier nicht. Der wäre nur
> erforderlich, wenn du bereits in /etc/init.d/ bist und dort das Skript
> aufrufen wolltest.

Das ist nicht ganz richtig, fürchte ich. In dem hier gezeigten Fall 
müßte das Skript im Unterverzeichnis etc/init.d/ des aktuellen 
Verzeichnisses liegen, denn da würde der Punkt das aktuelle Verzeichnis 
repräsentieren.

Wenn allerdings zwischen dem Punkt und dem Pfad Whitespace ist, mithin 
also stattdessen ". /etc/init.d/glabelsstart.sh" aufgerufen würde, dann 
ist der Punkt in der Bash ein Shortcout für das Bash-Builtin "source" 
(man 1 bash), das ein Skript im Kontext der aktuellen Shell aufruft. 
Normalerweise wird "source" allerdings dazu benutzt, um 
Umgebungsvariablen in der aktuell laufenden Shell zu setzen -- anstatt 
in der Subshell, die das Shellscript ausführt, wie das bei einem 
"normalen" Shellskript passieren würde. Pythons virtualenv(1) zum 
Beispiel nutzt das.

> Thorsten schrieb:
>> Ich habe das dann mit
>> sudo update-rc.d glabelsstart.sh defaults
>> in den Autostart verschoben.
>
> Das willst du nicht tun. Das sind weder die richtigen Benutzerrechte
> noch ist es der richtige Zeitpunkt für eine grafische Anwendung.

Absolut korrekt, wenngleich aus zum Teil anderen Gründen: Raspbian (das 
mittlerweile in "Raspberry Pi OS" umbenannt wurde) benutzt schon seit 
geraumer Zeit systemd, und update-rc.d(8) ist für SysV-Init gemacht. 
Deswegen ist es auch überholt, das Skript in /etc/init.d/ abzulegen.

Der richtige Weg, einen selbstentwickelten Daemon (nicht, wie hier, eine 
grafische Applikation) zu installieren und zu starten, wäre daher, das 
Programm oder Skript in /usr/local/bin/ unterzubringen (oder eine 
Sammlung ggf. in opt). Denn diese beiden Verzeichnisse sind für 
3rd-Party-Software im Filesystem Hierarchy Standard (FHS), der im 
Übrigen Bestandteil der Linux Standard Base (LSB) ist, vorgesehen, und 
sie werden deswegen von den Paketmaintainern des Distributors in Ruhe 
gelassen. Wer so etwas in andere Verzeichnisse installiert, riskiert 
damit, daß der Distributor beim nächsten Update ein gleichnamiges 
Programm oder Skript über das eigene installiert.

Der Richtige Weg (tm), ein solches eigenes Programm oder Skript beim 
Booten zu starten, wäre, ein systemd-Unitfile zu schreiben, es in 
/etc/systemd/system/ oder in /etc/systemd/user/ abzulegen (siehe dazu 
auch [1] und [2]) und dann zuerst mit dem "systemctl daemon-reload" die 
systemd-Konfiguration neu zu laden, es mit "systemctl enable 
<name-des-unitfile>" einzuschalten und ggf. mit "systemctl start 
<name-des-unitfile>" zu starten.

Aber, wie Du sehr richtig sagst, geht es hier nicht um einen Daemon oder 
eine Art von Hintergrundprogramm, sondern um eine grafische Applikation. 
Deswegen ist dies ebenfalls nicht der richtige Mechanismus, um das 
Programm bzw. Skript zu starten.

[1] https://wiki.ubuntuusers.de/systemd/User_Units/
[2] https://wiki.archlinux.org/index.php/systemd/User

> Insgesamt ist das aber der falsche Mechanismus. Für deinen Fall wäre ein
> Start mit der Desktop-Session sinnvoller

Wieder absolut korrekt. Übrigens könnte man theoretisch auch eine 
systemd User-Unit benutzen, aber die würde dann bei jedem Login (auch 
zB. per SSH) gestartet. Das kann man machen, wenn man SSH oder OpenSSH 
mit X-Forwarding benutzt, weil man auf dem SSH-Client einen X-Server 
hat, unter Windows ginge das etwa mit Moba XTerm oder dem bekannteren 
Xming.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.