Benötige Hilfe bei Ausführen eines Tasks nach reboot auf RPi4

  • Hallo zusammen,

    ich habe eine .java Datei, die nach einem Neustart des Raspberries gestartet werden soll. Um diese Datei ausführen zu können per Konsole muss noch ein -c <NAmeDerConfigdatei> übergeben werden..

    Ich habe es mit dem pi-user unter crontab wie folgt versucht:

    @reboot /home/pi/...../Controller -c ControllerConfig.properties <--- mit "..." sind noch diverse Unterordner gemeint

    Leider habe ich keinen Plan warum die Datei nicht nach einem Reboot ausgeführt wird.

    Da ich nicht immer manuell die Datei jeden Tag von Hand starten möchte, benötige ich Hilfe bei der Umsetzung auf dem Raspberry. Ich bin absoluter Neuling auf dem Gebiet und hoffe, dass mir jemand helfen kann.

    Danke und Grüße,

    Volx:danke_ATDE:

  • Benötige Hilfe bei Ausführen eines Tasks nach reboot auf RPi4? Schau mal ob du hier fündig wirst!

  • Absolute Pfade benutzen, immer, überall.

    Zitat

    @reboot /home/pi/KOMPLETTER/PFAD/Controller -c /KOMPLETTER/PFAD/ZU/ControllerConfig.properties

    Wenn du nichts zu sagen hast, sag einfach nichts.

  • Wow, das ging schnell :) Das mit den kompletten Pfaden habe ich schon gelesen, dass das Argument nach -c ebenfalls komplett übergeben werden musst war mir nicht klar.... Ich probiere es gleich aus!

    Ist die "1" am Anfang der Zeile von Bedeutung?

    Danke und GRüße,

    Volx

  • Alles klar, vielen Dank! Kann ich nach dem reboot-befehl noch eine Verzögerung reinbringen? Also nach dem reboot 90sekunden warten, bevor der Befehl ausgeführt werden soll?

    Ach, und ich hab gesehen, das das Crontab in /tmp/.. gespeichert wird. Hat das Auswirkungen oder passt das so?

  • Verzögerungen kannst du z.B. so erreichen:

    Code
    @reboot /bin/sleep 90; /home/pi/KOMPLETTER/PFAD/Controller -c /KOMPLETTER/PFAD/ZU/ControllerConfig.properties

    Wenn du per crontab -e eine Crontab bearbeitest, wird das Programm crontab diese erstmal als tmp-File nach /tmp/irgendwas schreiben. Beim Beenden erfolgt ein Syntaxcheck und wenn dieser erfolgreich ist, dann schreibt crontab das tmp-File in die richtige Crontab nach /var/spool/cron.... um. Alles OK also.

    Wenn du nichts zu sagen hast, sag einfach nichts.

  • Okay, soweit verstanden. Ich habe sudo crontab -e verwendet um die Table zu erstellen.

    Habe jetzt mal deine Ratschläge umgesetzt und, um konkret zu werden, sieht es jetzt wie folgt aus:

    Spoiler anzeigen

    SHELL=/bin/sh

    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

    @reboot /bin/sleep 120; /home/pi/iot-device-bosch-indego-controller-bosch-indego-controller-0.8/bosch-indego-controller-dist/target/bosch-indego-controller-dist-0.8/bin/IndegoMqttAdapter -c /home/pi/iot-device-bosch-indego-controller-bosch-indego-controller-0.8/bosch-indego-controller-dist/target/bosch-indego-controller-dist-0.8/bin/IndegoMqttAdapterConfig.properties

    Scheinbar muss noch ein Fehler hier irgendwo drinstecken. Da es ein Mqtt-Client ist, der gestartet werden soll, müsste ich bei erfolgreicher Ausführung das im IOBroker eigentlich sehen. Da bleibt der Adapter aber gelb. Wenn ich per Konsole ausführe, dann wird der Client auf dem RPi4 gestartet...

    Wie ist das dann, muss der, Client auch irgendwo im Hintergund laufen? Mit nohup oder ähnlichem?

    Danke und Grüße,

    Volx

  • Benutze deine eigene Crontab, also ohne sudo. Funktioniert es dann?

    Wie ist das dann, muss der, Client auch irgendwo im Hintergund laufen?

    Hänge ein & an das Ende des Aufrufs.

    Code
    @reboot /bin/sleep; ......0.8/bin/IndegoMqttAdapterConfig.properties &

    Wenn du nichts zu sagen hast, sag einfach nichts.

  • So, ich hab jetzt überall, einmal per sudo und einmal ohne sudo, die Crontabs bearbeitet. Leider bleibt das Lämpchen aktuell geln im iobroker...

    Kann ich mir irgendwie ausgeben lassen, ob der command ausgeführt worden ist?

    Zwischen sleep und 120 ist ein Leerzeichen, macht das was?

    Wäre cool, wenn es funktionieren würde :) Ist es von anderen Grundeinstellungen abhängig?

    • Offizieller Beitrag

    Kann es sein, dass "Du" beim Starten von diesem Java-Dingens in einem bestimmten Verzeichnis sein musst? Wo im Terminal (Verzeichnis) und wie genau (Befehl) startest Du das manuell?

    //Edit Und natürlich als welcher User wird das ausgeführt?

  • Einloggen tue ich mich mit dem pi-User. Standardmäßig startet der ja im /home/pi Verzeichnis. Gecheckr mit "pwd". Direkt nach dem Login kopiere ich den String ab /home/pi/... von oben in voller Länge in das Terminal und bestätige mit Enter.

    Könnte es sein, dass ich für den Crontab "/home/pi" weglassen kann/muss?

    • Offizieller Beitrag

    Dann wechsle mal im Cronjob vorher in dieses Verzeichnis und gib den Befehl so an, wie Du den im Terminal eingibst.

    Code
    @reboot /bin/sleep 90 && cd /home/pi && u.s.w.

    Btw. Hat oder brauch das Programm eine grafische Oberfläche auf dem Desktop?

  • Okay, versuche ich mal. Heisst, zwischen jedes Verzeichnis ein &&?

    Das Programm brauch keinen Desktop es ist nur ein Client, der States zum iobroker überträgt.

    Danke und Grüße,

    Volx

  • Hallo noise floor,

    Danke für den neuen Ansatz. Da ich programmiertechnisch ne Katastrophe bin, wie sähe ein solches Skript aus? Deswegen fand ich die vermeintlich einfache Lösung via Crontab charmant ?

    Hast du, im Bestfall, eine speziell für meinen Fall Step-by-step Anleitung?

    Ich möchte ja dadurch lernen und verstehen?

    Gruß,

    Volx

  • Hallo,

    willst du das Skript 90s nach dem Start ausführen, weil du wirklich 90 Sekunden warten musst (warum auch immer) oder weil du warten musst, damit die Netzwerkverbindung, die du ja brauchst, verfügbar ist? Wenn letzteres der Fall ist brauchst du keine Timer Unit, sondern nur eine systemd Service Unit mit der `After=network-online.target` Direktive.

    systemd ist ausufernd dokumentiert. Wenn du einen Einstiegspunkt auf deutsch brauchst: http://wiki.ubuntuusers.de/systemd Da gibt es auch ein Howto für eine Service Unit.

    Zitat

    Deswegen fand ich die vermeintlich einfache Lösung via Crontab charmant

    Bei den Rahmenbedingungen, die du hast, ist das aber nicht mehr einfach.

    Gruß, noisefloor

    • Offizieller Beitrag

    Heisst, zwischen jedes Verzeichnis ein &&

    Nein, nur so wie es da steht. Das u.s.w. ersetz Du mit dem Befehl, den Du in den Terminal eingeben würdest.

    Einen Versuch ist es wert. Du kannst Dich natürlich auch trotzdem in systemd einarbeiten.

  • So, dank eurer Hilfe läuft das Baby jetzt. Ich habe nochmal hyle's Variante versucht, die hat aber leider nicht zum Ziel geführt.

    --> Trotzdem fettes DANKE an hyle und Lutz für eure prompte Hilfe! :danke_ATDE:

    Danach hab ich mich an der vorgeschlagenen Variante mit systemd gewagt - und es hat funktioniert. Sogar nur mit einer .service-Unit.

    Diese Unit hört beiWantedBy=reboot.target jetzt auf den reboot des PIs. Funktion dann validiert im mqtt-Adapter im iobroker.

    Danke an noisefloor :danke_ATDE:

  • ps915 2. Februar 2024 um 21:06

    Hat das Label RPi 4 hinzugefügt.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!