autorun.sh: Wie realisieren (bzw. welche Methode ist aktuell)

  • Hallo zusammen,

    ich möche gerne beim Boot ein Skript laufen lassen (zB. cifs mounten, jdownloader starten, etc.).


    Habe jetzt dank Google einige Wege gefunden dieses zu realisieren:

    wie zB: Dummy QPKG erstellen was auf ein Skript verweist (scheint aber in neueren Versionen geblockt zu werden?!)


    Ich habe in Systemeinstellungen - Hardware ein "View autoscript.sh" gefunden. Wie kann ich dieses mit meinen Befehlen ergänzen bzw. wo befindet sich diese Datei?


    Würde mir helfen, wenn mir jemand sagen kann, welcher Weg am einfachsten ist das zu realisieren (QTS 4.3.3.0789)


    Vielen Dank!

    :cup:

  • Lies dich mal hier ein: Running_Your_Own_Application_at_Startup

    Nach dieser Anleitung ist "deine" Änderung direkt im Bootstrap drinnen.


    Eleganter ist es, wenn du nur einen Eintrag für eine eigene "autorun.sh" in den Bootstrap legst und diesen dann nicht bei jeder Änderung neu mounten musst:

    App [QTS SSL Certificat] deinstallieren oder deaktivieren? Da ist im Post #14 der richtige Eintrag für den Bootstrap gelistet.


    Damit bin ich gut klar gekommen und verwende schon seit längerem eine eigene autorun.sh für diverse Anpassungen ...

  • Habe das jetzt so gemacht, aber die Laufwerke werden nach einem Neustart nicht eingehängt.


    autorun.sh im Flash:

    Shell-Script
    1. #!/bin/sh
    2. echo "Starte autorun.sh..." >> /dev/kmsg
    3. [ ! -x /mnt/HDA_ROOT/.config/.autorun/autorun.sh ] || /mnt/HDA_ROOT/.config/.autorun/autorun.sh start 1>>/dev/kmsg 2>>/dev/kmsg
    4. if [ $? == 0 ]; then
    5. echo "autorun.sh...done" >> /dev/kmsg
    6. else
    7. echo "autorun.sh...failed" >> /dev/kmsg
    8. fi


    autorun.sh in /mnt/HDA_ROOT/.config/.autorun/:

    Shell-Script
    1. #!/bin/sh
    2. mount -t nfs 10.0.0.12:/media/hdd/NAS/Video /share/MD0_DATA/Multimedia/Video
    3. mount -t nfs 10.0.0.12:/media/hdd/movie /share/MD0_DATA/Multimedia/Video/Aufnahmen
    4. mount -t nfs 10.0.0.12:/media/hdd/NAS/Software /share/MD0_DATA/Multimedia/Software
    5. mount -t nfs 10.0.0.12:/media/hdd/NAS/Music /share/MD0_DATA/Multimedia/Music


    Beiden Dateien habe ich Ausführrechte gegeben.

    Wenn ich nach dem Start das zweitgenannte Skript ausführe, werden die Laufwerke richtig eingehängt.


    Hab ich irgenwas übersehen, finde jetzt keinen Fehler.


    Danke! Grüße Thomas

  • Versuche mal den vollen Pfad zum mount (e.g. /bin/mount) einzugeben.

    Je nach dem wie früh das Script startet sind noch keine Umgebungsvariablen gesetzt und das Script weiß nicht wo es mount zu finden hat. Just a try.

  • habe jetzt den vollen Pfad von mount eingetragen, aber immer noch keine Laufwerke eingehängt nach Neustart.

    Shell-Script
    1. #!/bin/sh
    2. /bin/mount -t nfs 10.0.0.12:/media/hdd/NAS/Video /share/MD0_DATA/Multimedia/Video
    3. /bin/mount -t nfs 10.0.0.12:/media/hdd/movie /share/MD0_DATA/Multimedia/Video/Aufnahmen
    4. /bin/mount -t nfs 10.0.0.12:/media/hdd/NAS/Software /share/MD0_DATA/Multimedia/Software
    5. /bin/mount -t nfs 10.0.0.12:/media/hdd/NAS/Music /share/MD0_DATA/Multimedia/Music


    Hier der Output von dmesg:


    Habe jetzt das Skript auf -o nolock abgeändert:

    Shell-Script
    1. #!/bin/sh
    2. /bin/mount -t nfs -o nolock 10.0.0.12:/media/hdd/NAS/Video /share/MD0_DATA/Multimedia/Video
    3. /bin/mount -t nfs -o nolock 10.0.0.12:/media/hdd/movie /share/MD0_DATA/Multimedia/Video/Aufnahmen
    4. /bin/mount -t nfs -o nolock 10.0.0.12:/media/hdd/NAS/Software /share/MD0_DATA/Multimedia/Software
    5. /bin/mount -t nfs -o nolock 10.0.0.12:/media/hdd/NAS/Music /share/MD0_DATA/Multimedia/Music

    Funktioniert aber auch nicht.

    dmesg Output:

    Code
    1. [ 934.450491] mount.nfs: Connection timed out
    2. [ 934.457729] autorun.sh...failed

    2 Mal editiert, zuletzt von homass1 ()

  • Ja wie gesagt, wenn ich das Skript manuell ausführe, dann wird alles richtig eingehängt.

  • Das Log sagt dir doch, was nicht läuft: für NFS benötigst du den DIenst statd und der ist zu dem Zeitpunkt wo deine autorun.sh aufgerufen wird noch nicht geladen. Darum klappt es zwar "händisch" weil der Dienst dann geladen ist, aber mit der autoun.sh nicht.

    Code
    1. mount.nfs: rpc.statd is not running but is required for remote locking.
    2. [ 437.995186] mount.nfs: Either use '-o nolock' to keep locks local, or start statd.

    Also entweder musst du deine autorun.sh später im Bootprozess ausführen lassen (keine Ahnung wie) oder du suchst auf NAS wo der Dienst statd zu finden ist und startest ihn in deinem Skript bevor du NFS mounts benutzen willst.

  • Darum habe ich ja die Option -o nolock hinzugefügt, um diesen Dienst nicht zu benötigen.

    Aber klappt trotzdem nicht.


    Würde es z.B. funktionieren wenn ich einen "sleep" Befehl vor den "mount" Befehlen einfüge?

    Sodass die mounts erst später ausgeführt werden, und das System schon weiter hochgefahren ist.


    Oder wird gewartet bis die autorun.sh durch ist, und dann erst weiter "hochgefahren"?

    Hier die angepasste autorun.sh mit z.B. 60 Sekunden Verzögerung:

    Würde das so funktionieren?

    Shell-Script
    1. #!/bin/sh
    2. sleep 60
    3. mount -t nfs 10.0.0.12:/media/hdd/NAS/Video /share/MD0_DATA/Multimedia/Video
    4. mount -t nfs 10.0.0.12:/media/hdd/movie /share/MD0_DATA/Multimedia/Video/Aufnahmen
    5. mount -t nfs 10.0.0.12:/media/hdd/NAS/Software /share/MD0_DATA/Multimedia/Software
    6. mount -t nfs 10.0.0.12:/media/hdd/NAS/Music /share/MD0_DATA/Multimedia/Music


    Grüße Thomas

    2 Mal editiert, zuletzt von homass1 ()

  • Würde es z.B. funktionieren wenn ich einen "sleep" Befehl vor den "mount" Befehlen einfüge?

    Nö, denke nicht. Zumindest war das meine Erfahrung mit der Autorun.sh, dass bei einem sleep blos die Laufzeit verlängert wurde, aber keine anderen Scripte vorgezogen wurden.


    Probier es einfach aus und schau dir wieder dmesg an (fang von hinten an, das wesentliche steht in diesem Fall ziemlich am Ende ... )

  • OK, ja ich werde das später mal versuchen.


    Ein anderer Ansatz wäre vll. die "echte" autorun.sh nach 60 Sekunden und im Hintergrund laufen zu lassen.

    Also in der autorun.sh im Flash irgendwie diese Befehle einbauen.


    Schematisch so zirka:

    Code
    1. sleep 60 ; autorun.sh &

    oder mit "&&" statt ";" ?!

  • Hi,

    werte doch den Rückgabewert $? des mount-Befehls aus. Das legst du dann in eine "Schleife", bis der Befehl Erfolg hat.

    Der Ansatz mit sleep im Skript, sollte aber auch funktionieren.

  • Nein sleep wird mit ziemlicher Sicherheit nicht funktionieren, da bei klassischen Init Systemen nichts parallel ausgeführt wird. Sprich ein sleep würde wie schon erwähnt ausschließlich den gesamten Startprozess verzögern. Auch eine Schleife sollte da wenig Abhilfe schaffen, da ja nicht gleichzeitig im Hintergrund irgendwann mal statd geladen wird.


    Hast du mal versucht statd selbst zu starten? Bei mir liegt das unter /usr/sbin/rpc.statd, ich weiß aber nicht, ob es ggf. noch Parameter benötigt.

  • Die autorun.sh in /mnt/HDA_ROOT/.config/.autorun/ ist deine Startrampe für verschiedenes und dient dazu, nicht immer ins Flash zu müssen. Also solltest du alle Aktionen auch dort machen.

    Es reicht auch nicht, die Verzeichnisse nur zu mounten. Du musst auch dafür sorgen, dass bei einem Reboot oder Shutdown die Mounts wieder aufgehoben werden.


    So könntest du zwei weitere Scripte schreiben, eines fürs Mounten und eines fürs Unmounten.

    Das Mountscript enthält dann den Code wie du ihn oben hast inclusive Sleepbefehl und wird in der Autorun in Sektion 'Start' per ./mountscript.sh & aufgerufen.

    Das zweite Script mit den Unmounts wird dann in der Autorun unter der Sektion 'Stop' gestartet.

    Das funktioniert deshalb, weil für die Autorun beim Start ein Symlink in /etc/rcK.d erstellt wird, welcher wiederum bei Shutdown/Reboot mit der Option 'Stop' aufgerufen wird.


    Deine /mnt/HDA_ROOT/.config/.autorun/autorun.sh könnte dann in etwa so aussehen.


  • OK, danke für eure (schnellen) Antworten. :beer:


    Ich werde übers Wochenende (wenn der QNAP weniger gebraucht wird) eure Ansätze testen und Rückmendung geben.


    :qclub::thumbup::thumbup:

  • Wenn du dir die autorun.sh so angepasst hast, wie dr_mike es weiter oben ausgeführt hat (funktioniert übrigens super, so habe ich es auch angefangen), dann könntest du noch etwas "kniffeliger" agieren.


    Unter /etc/rcS.d/ sehe ich bei mir einen Eintrag S99nfs, das heißt die "originalen" nfs Funktionen werden fast ganz am Ende des Startes ausgeführt. D.h. dein Script müsste danach gestartet werden, kannst du aber nur indirekt beeinflussen indem du danach einen Link für dein "Custom" Script einfügst.


    Ich habe daher ganz am Ende einen Link S99za_autorun drinnen, der als Letzter beim Start aufgerufen wird. Da die rcS.d bei jedem Reboot gesäubert wird, musst du deinen Link immer wieder neu reinschreiben … ?(


    Das kann dir aber deine Autorun.sh beim Start/Stop mit erledigen :)


    Sieht bei mir dann so aus:



    Mit den beiden Ergänzungen beim Start() und Stop() des Scriptes Autorun.sh schreibt es sich selber "reboot-fest" am Ende der Startroutinen, bzw. am Anfang der Stoproutinen rein.

    (Muss immer wieder neu verlinkt werden, da alle Links gelöscht und nur die Systemlinks per Default neu geschrieben werden ...)


    Spätestens nach dem erstem Reboot hat sich die Autorun.sh selbst verlinkt und kann danach bei jedem Start am Ende des Startvorganges aufgerufen werden. :beer:


    Funktioniert bei mir einwandfrei und schreibt mir die "System-gesäuberte" crontab immer wieder recht brav nach meinen Wünschen um ...

  • Mit den beiden Ergänzungen beim Start() und Stop() des Scriptes Autorun.sh schreibt es sich selber "reboot-fest" am Ende der Startroutinen, bzw. am Anfang der Stoproutinen rein.

    Die wird schon ohne die Ergänzung ganz an den Anfang der Stoproutinen verlinkt.

    Ein verlinken innerhalb der Ausführung von Stop bringt nichts, da danach das NAS eh ausschaltet und damit der Link wech ist.

  • Hallo dr_mike , werde da sicher jetzt nicht mit dir herumstreiten, ob es was bringt oder nicht, da habe ich mir zu viel von dir abgeschaut ;-)


    Habe bei meiner NAS wirklich sehr viel herumprobiert um den Virenscanner dazu zu bewegen, sich nicht erst nach Mitternacht upzudaten, sondern zu einer Zeit, die ich ihm vorgebe. Mit GENAU (!) dieser Konfiguration klappt es ... ohne dem zusätzlichem Eintrag im Stop aber nicht!


    Ich gebe dir recht, dass nach dem Ausschalten meine Verlinkung wieder weg ist, deshalb muss ich sie auch jedesmal wieder neu reinschreiben (lassen).

    Fakt ist aber auch, dass die Autorun (ohne Ergänzung) zu Beginn von Stop ausgeführt wird, danach aber erst die "Reinigung" des Systemes anläuft und die crontab umgeschrieben (gesäubert) wird. Alles was ich vorher an Systemeinträgen ändere ist damit wieder weg!

    Daher setze ich meinen Link NACH dem Clean durch das System und kann die crontab wieder umschreiben und zusätzlich meinen Link in das Run schreiben, der wird nämlich auch im Stop gelöscht.


    Muss aber keiner so machen, wollte nur einen Weg aufzeigen der mit der crontab und dem McAfee funktioniert ... aber jeder macht es halt so wie er es für richtig hält.


    Habe hier schon von vielen gelesen, dass sie den McAfee vergeblich zu einer anderen Zeit updaten lassen wollten ... von keinem habe ich eine Lösung gefunden die funktioniert. Daher mein Ansatz, der dir halt nicht richtig erscheint.