Forum: PC-Programmierung Speicherort unter Linux (RaspiOS)


von Rahul D. (rahul)


Lesenswert?

Moin,
ich habe eine sh-Datei geschrieben, die sich im Verzeichnis "/home/pi" 
befindet. Sie startet ihrerseits dann ein python-script.
Wenn ich sie lokal mit "./script.sh" starte, werden die log-Dateien auch 
in das gewünschte Verzeichnis geschrieben.
Jetzt würde ich diese shell-script gerne automatisch starten (und im 
Hintergrund laufen lassen).

Dazu habe ich ans Ende der "/etc/rc.local" den Aufruf 
"/home/pi/script.sh &" angefügt.
Das Script wird auch ausgeführt (der erzeugte Server läuft).
Leider bekomme ich weder die Logs in das richtige Verzeichnis 
geschrieben, noch werden die zu transferierenden Dateien gefunden.

Die Option "su user ..." (der genaue Wortlaut ist mir entfallen), um das 
Script mit dem Benutzer "pi" auszuführen, funktioniert nicht, da der ein 
Passwort benötigt.

Das sh-Script sieht etwa so aus ("Namen von der Redaktion geändert" ;)):
1
#!/bin/bash
2
cd /home/pi/script-verzeichnis
3
python3 python-Script.py

Im manuellen Betrieb werden die Logs, die das python-Script erzeugt, 
einwandfrei in den entsprechenden Ordner unterhalb des 
script-verzeichnis geschrieben.

Was muss ich da jetzt noch "hinbasteln"?

Vielen Dank schon mal

von Norbert (Gast)


Lesenswert?

Das Python script mit chmod +x ›Dateiname‹ ausführbar machen.
Im Python script:
1
import os
2
os.chdir('/home/pi/script-verzeichnis')

von Norbert (Gast)


Lesenswert?

…vergessen…
Das bash script brauchst du dann nicht mehr.

von Norbert (Gast)


Lesenswert?

…nur zur Sicherheit…
Passendes Shebang im Python-Script:
1
#!/usr/bin/python3

von Rahul D. (rahul)


Lesenswert?

Norbert schrieb:
> Das Python script mit chmod +x ›Dateiname‹ ausführbar machen.
> Im Python script
1
import os
2
os.chdir('/home/pi/script-verzeichnis')

Mist! Hätte ich mir auch denken können.
Danke!

Das shell-Script behalte ich einfach mal bei...
Aber Danke für den Hinweis.

von Imonbln (Gast)


Lesenswert?

Rahul D. schrieb:
> Dazu habe ich ans Ende der "/etc/rc.local" den Aufruf
> "/home/pi/script.sh &" angefügt.

https://wiki.ubuntuusers.de/rc.local/

Auch auf den Raspi gibt es systemd eine Unit zu schrieben ist nicht 
schwer.

Rahul D. schrieb:
> Die Option "su user ..." (der genaue Wortlaut ist mir entfallen), um das
> Script mit dem Benutzer "pi" auszuführen, funktioniert nicht, da der ein
> Passwort benötigt.

einfach in der systemd service unit user & group setzen dann sollte der 
Service als user/group starten (ohne passwort). btw root und jeder 
Benutzer mit  CAP_SETUID sollte su ohne Passwort abfrage machen dürfen.

Rahul D. schrieb:
> Im manuellen Betrieb werden die Logs, die das python-Script erzeugt,
> einwandfrei in den entsprechenden Ordner unterhalb des
> script-verzeichnis geschrieben.

vermutlich startest du das script manuelle als andrer Benutzer (pi nicht 
root) im richtigen Verzeichnis.

Norbert schrieb:
> Das Python script mit chmod +x ›Dateiname‹ ausführbar machen.
> Im Python script:import os
> os.chdir('/home/pi/script-verzeichnis')

Autsch, dass ist aber mal ein Workaround. Das Problem dürfte sein das 
das script nun zwar an der richtigen stelle alles Speichert aber 
vermutlich gehören die Dateien dann root:root und der Benutzer kann die 
nicht anfassen. Abgesehen davon macht der Hart codierte Benutzer Pfad 
das Script maximal unportierbar da es nur auf den Raspi mit diesen 
Benutzer funktioniert. Wenn schon solche Workarounds dann wenigstens:
1
os.chdir(os.path.join(os.path.expanduser('~'), 'script-verzeichnis'))
Das Problem mit den Benutzer rechten bleibt aber.

von Norbert (Gast)


Lesenswert?

@Imonbln
Formal hast du recht, jedoch…
* halte ich einen Raspi nicht unbedingt für ein System auf dem sich 
viele verschiedene Benutzer herum treiben.
* ist die Pfad-Kodierung nur von ›bash‹ in ›Python‹ veschoben.
Wer weiss ob nicht vielleicht etwas nur explizit für ›user‹ geloggt 
werden soll.
* ist es mit ›os.chown()‹ ›os.chgrp()‹ möglich Änderungen an den 
Zugriffsrechten zu ermöglichen.
* man kann sogar ›root‹ Rechte aufgeben und unter einer anderen UID das 
Python Script laufen lassen. (Evtl sogar forken)

Aber ansonsten stimme ich dir zu.

von Rahul D. (rahul)


Lesenswert?

Imonbln schrieb:
> Rahul D. schrieb:
>> Dazu habe ich ans Ende der "/etc/rc.local" den Aufruf
>> "/home/pi/script.sh &" angefügt.
>
> https://wiki.ubuntuusers.de/rc.local/
>
> Auch auf den Raspi gibt es systemd eine Unit zu schrieben ist nicht
> schwer.
Jupp. Mit "User=pi" und "Group=pi" gibt es keine Rechte-Problem, nachdem 
ich auch die darüberliegen Verzeichnisse mit "chmod pi:pi ..." behandelt 
habe.

> vermutlich startest du das script manuelle als andrer Benutzer (pi nicht
> root) im richtigen Verzeichnis.
Jupp. mit "sudo ..." funktionierte es dann auch, ist aber nicht das, was 
ich wollte.

>
1
> os.chdir(os.path.join(os.path.expanduser('~'), 'script-verzeichnis'))
2
>
> Das Problem mit den Benutzer rechten bleibt aber.
Das script-Verzeichnis müsste dann aber wohl eher dort angesiedelt sein, 
wo alle möglichen Benutzer ran dürfen.

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.