QNAP autostop.sh - Skripte beim Herunterfahren automatisch ausführen

  • hallo,

    mit einem Trick durch die Hintertür geht dies!

    Du richtest dir "autorun" ein. Kannst ja dafür auch mein Script, zu finden in Installation von OWNCloud , nutzen. Das LIBXML Zeug - wenn du es dann nicht brauchst - kannst du aus der localen autorun.sh entfernen.

    Du erstellst dir ein Script in dem all dies gemacht wird, was du beim runterfahren ausführen willst. Durch die locale autorun.sh lässt du dieses Script immer nach /etc/init.d kopieren. Ebenso lässt du durch die locale autorun.sh einen symlink in /etc/rcK.d erstellen der auf dein Script in /etc/init.d verweist. Achtung - auf die Namenskonvention achten die in /etc/rcK.d benutzt wird. Die Nummerierung gibt die Reihenfolge der Abarbeitung der Scripte beim Runterfahren an!

    Das Script auf das ich oben verweise macht dies alles für dich! Du musst nur noch in die autorun.sh (in der stop Sektion) die Dinge eintragen was beim reboot/shutdown/poweroff gemacht werden soll.

    mfg kasimodo

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von kasimodo () aus folgendem Grund: bessere Lösung

  • Danke kasimodo, aber so ganz verstehe ich Deinen Ansatz nicht oder kann Deinen Trick nicht nachvollziehen.
    Ich suche eine Methode welche beim initiierten Herunterfahren des NAS mir noch zusätzlich die Möglichkeit gibt ein Skript auszuführen.

    zum Beispiel: Ich kenne Ansätze unter Linux-Distributionen welche beim Wechsel des runlevels reagieren, dass wäre perfekt.... und da bei unseren QNAPs ja ein Ubuntu unter der Haube steckt, müsste da doch was möglich sein ?!
  • Genau das macht die autorun.sh in verbindung mit dem symlink in /etc/rcK.d

    Auf dem Qnap gibt es unter /etc die beiden Verzeichnisse rcS.d und rcK.d ! in diesen Verzeichnissen sind symlinks auf die Skripte unter /etc/init.d

    Beim Booten werden alle mit den Symlinks unter /etc/rcS.d verknüpften Scripte mit dem Parameter "start" ausgeführt.
    Beim Runterfahren/Reboot/Shutdown werden alle Skripte die in /etc/rcK.d verknüpft sind mit dem Parameter "stop" ausgeführt.

    Die mit den Symlinks verknüpften Skripte müssen nicht zwingend unter /etc/init.d gespeichert sein!

    Also brauchst du auf deinem System ein Script was mit dem Parameter "stop" aufgerufen werden kann und einen Symlink unter /etc/rcK.d der auf dieses Skript verweist. Da man keine Dateien oder Sysmlinks bootfest unter /etc anlegen kann muss dieser Symlink in /etc/rcK.d bei jedem booten vom NAS neu angelegt werden damit der beim Runterfahren vorhanden ist! Dies kann man mit "autorun" beim Booten realisieren!
    Und wenn man schon mal ein Skript anlegt das beim Booten ausgeführt wird, was hindert daran dies Skript auch gleich dafür zu benutzen um dort alles einzutragen was auch beim runterfahren ausgeführt werden soll. Voraussetzung dafür ist, dass dieses Script die Parameter (Argumente) start / stop ünterstützt.

    Beispiel:


    Shell-Script: Start / Stop Skript - autorun.sh

    1. #!/bin/sh
    2. #autorun.sh
    3. start()
    4. {
    5. echo `date` Start APP "AutoRun" autorun.sh >> /var/log/autorun.log
    6. # Autorun ausführen bei shutdown/restart/poweroff
    7. ln -s /share/MD0_DATA/.qpkg/autorun/autorun.sh /etc/rcK.d/K01autorun
    8. # ab hier alles eintragen was noch beim "start" ausgeführt werden soll
    9. # Ende - was beim "start" ausgeführt werden soll
    10. }
    11. stop()
    12. {
    13. echo `date` Stop autorun.sh >> /var/log/autorun.log
    14. # ab hier alles eintragen was noch beim "STOP" ausgeführt werden soll
    15. # Ende - was beim "STOP" ausgeführt werden soll
    16. }
    17. # you do not need to edit this lines
    18. case "$1" in
    19. start)
    20. start
    21. ;;
    22. stop)
    23. stop
    24. ;;
    25. restart)
    26. # Restarting the Daemon
    27. $0 stop
    28. $0 start
    29. ;;
    30. *)
    31. ## If no parameters are given, print which are avaiable.
    32. echo "Usage: $0 {start|stop|restart}"
    33. exit 1
    34. ;;
    35. esac
    36. exit
    Alles anzeigen
    Eventuell muss noch in Zeile 7 /share/MD0_DATA/.qpkg/autorun/autorun.sh der Pfad angepasst werden!

    Das weiter oben verlinkte Skript im anderen Beitrag ist ein Installationsscript was "autorun" auf dem QnapNAS einrichtet unabhänig vom NASTYP !!!!! Funzt auf NAS mit Intel , ARM und auch auf x31 usw.!


    Alles Klar?

    Hier noch mal das überarbeitete Installationsscripte, dass "autorun" auf deinem NAS (unabhänig von der verwendetetn Hardware) einrichtet. Ich habe u.a. noch diverse Kommentare zur Erklärung eingefügt.

    Shell-Script: create_autorun.sh

    1. #!/bin/sh
    2. #Installation - anlegen "autorun.sh" auf einem QNAP NAS für die eigene Anpassungen
    3. #------------------------------------------------------
    4. #Hiernach ändern! Soll eventuell vohandene autorun erneuert werden (YES/NO) - Backup anlegen (YES/NO)
    5. REWRITE="YES" # YES/NO
    6. BACKUP="YES" # YES/NO
    7. #--------------- ab hier nichts mehr ändern ---------------------------------------
    8. #Ermittlung der Hardware und Festlegen was gemountet werden soll
    9. MOUNTPOINT="/tmp/config"
    10. BOOT_CONF=`/bin/cat /etc/default_config/BOOT.conf 2>/dev/null`
    11. CONFIG_DEV_NODE=`/sbin/getcfg "CONFIG STORAGE" DEVICE_NODE -f /etc/platform.conf`
    12. CONFIG_DEV_PART=`/sbin/getcfg "CONFIG STORAGE" FS_ACTIVE_PARTITION -f /etc/platform.conf`
    13. CONFIG_DEV_FS=`/sbin/getcfg "CONFIG STORAGE" FS_TYPE -f /etc/platform.conf`
    14. # check if the HAL subsystem exist
    15. modelname="$(/sbin/getcfg "System" "MODEL" -f /etc/config/uLinux.conf)"
    16. if [ -x /sbin/hal_app ]; then
    17. BOOT_DEV=$(/sbin/hal_app --get_boot_pd port_id=0)
    18. elif [ "x${BOOT_CONF}" = "xTS-NASARM" ]; then
    19. BOOT_DEV="/dev/mtdblock"
    20. else
    21. BOOT_DEV="/dev/sdx"
    22. fi
    23. if [ "x$CONFIG_DEV_NODE" != "x" ]; then
    24. DEV_NAS_CONFIG=${CONFIG_DEV_NODE}${CONFIG_DEV_PART}
    25. elif [ "x${BOOT_CONF}" = "xTS-NASARM" ]; then
    26. if [ -f /etc/IS_TAS ]; then
    27. DEV_NAS_CONFIG=${BOOT_DEV}7
    28. else
    29. DEV_NAS_CONFIG=${BOOT_DEV}5
    30. fi
    31. else
    32. DEV_NAS_CONFIG=${BOOT_DEV}6
    33. fi
    34. if [ "x$CONFIG_DEV_NODE" != "x" ]; then
    35. if [ "x$CONFIG_DEV_FS" = "xubifs" ]; then
    36. /sbin/ubiattach -m $CONFIG_DEV_PART -d 2
    37. /bin/mount -t ubifs ubi2:config /tmp/config -o ro > /dev/null 2>&1
    38. [ ! -f /etc/IS_TAS ] || /bin/mount -t ext4 /dev/mmcblk0p7 /tmp/config
    39. else
    40. return 0
    41. fi
    42. else
    43. /bin/mount $DEV_NAS_CONFIG -t ext2 $MOUNTPOINT
    44. fi
    45. # wenn mount erfolgreich - autorun (MTD) und autorun.sh im localen Filesystem anlegen
    46. if [ "$?" = "0" ]; then
    47. if [[ -x /tmp/config/autorun.sh && $REWRITE = "NO" ]] ; then
    48. #echo "SUCCESS! autorun.sh vorhanden"
    49. echo -e "\033[32m "autorun.sh"(MTD)ist schon vorhanden \033[0m" - keine neue "autorun.sh" angelegt!
    50. umount $MOUNTPOINT
    51. #exit
    52. else
    53. if [[ -e /tmp/config/autorun.sh && $BACKUP = "YES" ]] ; then cp /tmp/config/autorun.sh /tmp/config/autorun.bak ; fi
    54. echo -e "\033[32m Neue "autorun.sh"(MTD) wird angelegt! \033[0m"
    55. cat > /tmp/config/autorun.sh << "EOF"
    56. #!/bin/sh
    57. # AUTORUN.SH - "Boot strap"
    58. echo `date` Start autorun MTD > /var/log/autorun.log
    59. for Auto_Dir in `ls -d /share/* | grep "_DATA" | sort`
    60. do
    61. if [ -x ${Auto_Dir%/}/.qpkg/autorun/autorun.sh ]; then
    62. echo `date` ausführbare "autorun.sh" im Verzeichnis $Auto_Dir/.qpkg/autorun gefunden >> /var/log/autorun.log
    63. ${Auto_Dir%/}/.qpkg/autorun/autorun.sh start
    64. exit
    65. fi
    66. done
    67. echo `date` keine ausführbare "autorun.sh" gefunden
    68. EOF
    69. chmod 755 /tmp/config/autorun.sh
    70. umount $MOUNTPOINT
    71. #ausführen der Autorun in der Konfiguration aktivieren
    72. /sbin/setcfg Misc "Autorun" "TRUE"
    73. fi
    74. else
    75. echo -e "\033[31m ERROR \033[0m " Fehler beim Ausführen von /bin/mount $DEV_NAS_CONFIG -t ext2 $MOUNTPOINT
    76. exit
    77. fi
    78. #locale autorun anlegen
    79. for ROOT_SHARE in `ls -d /share/* | grep "_DATA" | sort`
    80. do
    81. if [ -d ${ROOT_SHARE%/}/.qpkg ]; then Auto_Dir=${ROOT_SHARE%/}/.qpkg/autorun ; fi
    82. done
    83. if [[ -e ${Auto_Dir%/}/autorun.sh && $REWRITE = "NO" ]]; then
    84. echo -e "\033[32m ${Auto_Dir%/}/autorun.sh (local) \033[0m" ist schon vorhanden Script wird beendet!
    85. exit
    86. else
    87. echo -e "\033[32m Neue "autorun.sh" (local) wird angelegt! \033[0m"
    88. if [[ -e ${Auto_Dir%/}/autorun.sh && $BACKUP = "YES" ]] ; then cp ${Auto_Dir%/}/autorun.sh ${Auto_Dir%/}/autorun.bak ; fi
    89. if [ ! -d ${Auto_Dir%/} ]; then mkdir ${Auto_Dir%/} ;fi
    90. cat > ${Auto_Dir%/}/autorun.sh << "EOF"
    91. #!/bin/sh
    92. #autorun.sh
    93. start()
    94. {
    95. echo `date` Start APP "AutoRun" autorun.sh >> /var/log/autorun.log
    96. # Autorun ausführen bei shutdown/restart/poweroff
    97. EOF
    98. echo ln -s ${Auto_Dir%/}"/autorun.sh /etc/rcK.d/K01autorun >null 2>&1">> ${Auto_Dir%/}/autorun.sh
    99. cat >> ${Auto_Dir%/}/autorun.sh << "EOF"
    100. #======================================================================
    101. # ab hier alles eintragen was noch beim "start" ausgeführt werden soll
    102. #Beispiel: libxml2 neue Version für owncloud bzw. nextcloud
    103. file="/usr/lib/libxml2.so.2.6.30"
    104. if [[ -e $file && ! -e /usr/lib/org.libxml2.so.2.6.30.org ]]; then
    105. mv $file /usr/lib/org.libxml2.so.2.6.30.org
    106. cp /usr/local/medialibrary/lib/libxml2.so.2.9.2 $file
    107. else
    108. cp /usr/local/medialibrary/lib/libxml2.so.2.9.2 $file
    109. fi
    110. /mnt/ext/opt/apache/bin/apachectl restart
    111. #Ende Beispiel
    112. # Ende - was beim "start" ausgeführt werden soll
    113. #================================================
    114. }
    115. stop()
    116. {
    117. echo `date` Stop autorun.sh >> /var/log/autorun.log
    118. #====================================================================
    119. # ab hier alles eintragen was noch beim "stop" ausgeführt werden soll
    120. # Ende - was beim "stop" ausgeführt werden soll
    121. #================================================
    122. }
    123. # you do not need to edit this lines
    124. case "$1" in
    125. start)
    126. start
    127. ;;
    128. stop)
    129. stop
    130. ;;
    131. restart)
    132. # Restarting the Daemon
    133. $0 stop
    134. $0 start
    135. ;;
    136. *)
    137. ## If no parameters are given, print which are avaiable.
    138. echo "Usage: $0 {start|stop|restart}"
    139. exit 1
    140. ;;
    141. esac
    142. exit
    143. EOF
    144. chmod 755 ${Auto_Dir%/}/autorun.sh
    145. echo ===========================================================================
    146. echo Deine locale "autorun.sh" befindet sich in ${Auto_Dir%/}
    147. echo ===========================================================================
    148. fi
    149. echo "Fertg! - Ende!"
    Alles anzeigen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von kasimodo ()

  • Bin derzeit noch im Urlaub - werde ich mir in ca. 2 Wochen aber anschauen. Danke vorab.
    Da wohl einige QUser ähnliche Anforderungen haben werde ich versuchen hier eine Step by Step Anleitung für ein einfaches Autostop Skript zu posten (oder Du?). Anhand meiner Anforderung: ein vorher manuell gemountetes NFS share per Autostop (bei Herunterfahren) zu unmounten. Wobei das auszuführende Skript denkbar einfach ist - in meinem Fall nur aus einem Befehl besteht:

    Shell-Script

    1. #!/bin/sh
    2. umount /share/mydata/_temp/mntpoint

    Eine Lösung im Q-Forum sollte dann möglichst einfach und für Non-IT-Experts entstehen...... Also ein Autorun.sh skript welches lediglich den Symlink auf das obige Skript in /etc/rcK.d schreibt.
    Bin allerdings noch nicht sicher wie ich mein Skript (siehe oben) mit Argumenten wie "start" und "stop" ausstatten kann - Wie Du es als notwendig beschrieben hast. Wobei meinem Skript ja egal wäre welches $1 Argument übergeben wird.... es wird doch immer ausgeführt und stört sich auch nicht an Argumenten - oder liege ich da falsch?
  • Danke Kasimodo.
    Ich habe noch eine womöglich einfachere Methode recherchiert: Nicht nfs sondern smb mounts in der autorun.sh verwenden! Auch die manuell angelegten smb-mounts (also z.B. via autorun) werden beim Herunterfahren des QNAP automatisch und per default getrennt, so dass das NAS sauber runterfährt.