【SCRIPT】create-autorun.sh

說明

這是一個一次性執行的 BASH(BASH)腳本,可在您的 QNAP NAS 上建立自動執行環境。您可以用來在 NAS 開機時自動執行您自己的腳本。

本專案的目標是支援所有 QNAP NAS 型號以及所有 QTS 與 QuTS hero 版本。如在您的 NAS 上執行時遇到任何錯誤,請告知。

功能說明

此安裝腳本會將一個autorun.sh 處理器寫入您的預設磁區,在 .system 目錄下。然後會將此處理器從 DOM(DOM)建立符號連結回您的預設資料磁區,使其在 NAS 啟動時執行。這表示您不需要每次想更改 autorun.sh 內容時都掛載 DOM 分割區。

自動執行裝置與分割區會由此腳本自動判斷。

如何建立您的 autorun.sh

curl -skL https://git.io/create-autorun | sudo bash

注意事項

  • 如果您之前沒有 autorun.sh 檔案,則此工具建立的 autorun.sh 檔案會包含一個腳本目錄處理器,並會為您的 shell 腳本建立一個 scripts 目錄。此 scripts 目錄中的所有內容都會在 NAS 啟動時由預設的 autorun.sh 檔案依序執行。以下說明僅適用於此工具建立的 autorun.sh。如果您已經有其他 autorun.sh 檔案,則該檔案會保留並繼續使用,以下說明將不適用。

  • 自動執行系統的位置會依您的預設磁區名稱而定。例如:如果您的預設磁區為 CACHEDEV1_DATA,則自動腳本處理器會建立於:

/share/CACHEDEV1_DATA/.system/autorun/autorun.sh

…而腳本目錄會建立於:

/share/CACHEDEV1_DATA/.system/autorun/scripts/
  • autorun.sh 會在 NAS 開機過程中某個時點被觸發,然後依預設檔名順序執行 scripts 目錄中的每個可執行檔案。如果您需要某個腳本先於其他腳本執行,請在檔名前加上數字,例如:

10-example.sh 20-example.sh 25-example.sh 30-example.sh

  • autorun.sh 執行期間會建立一個日誌檔。該檔案位於 /var/log/autorun.log,內容包含每個在 scripts 目錄中被執行的可執行腳本的日期時間與名稱,以及這些腳本所產生的 stdout 和 stderr。

  • 本專案的原始碼可於 GitHub 找到

在 QTS 5.2.5 上安裝沒問題,但當我嘗試執行我的腳本時,會出現「command not found」錯誤。看起來 autorun.sh 在所有 QPKG 執行之前就已經運行,因此找不到相關指令。如果我稍後手動執行,一切都能正常運作。在開頭加上「sleep」指令沒有任何效果(除了「sleep」本身)。

此致敬禮…

正確。autorun.sh 在 QPKG 啟動之前執行。

sleep 沒有幫助,因為它只會延遲開機流程直到 autorun 完成,其中也包含啟動 QPKG。

我後來創建了 RunLast QPKG 來協助解決這個問題,但自從 QTS 5.2.0 以後,由於 QNAP 將 QPKG 啟動改為非同步,這個方法已經無法使用。

目前沒有辦法在啟動後執行依賴 QPKG 的腳本。

這還不太對。
我現在已經找到了解決方案,是透過“MyQNAP”倉庫中的“RunLast”來實現的。剛開始時我很驚訝它也產生了同樣的錯誤,所以我做了一些研究。我發現 QNAP 的服務並不完全是非同步啟動的,特別是它們並不總是會等待依賴項成功啟動後才繼續。
因此,我修改了我的啟動腳本,使其能考慮到這一點。
這部分與 QNAP 根據已安裝的應用程式動態連結其二進位檔和函式庫的方式有關。
例如,“autostart.sh”通常會失敗,因為大多數函式庫和二進位檔尚未“連結”。同樣的情況部分也適用於“RunLast”。
但請不要停止開發“RunLast”。它已經採取了正確的方向,尤其是因為 SysV 啟動腳本的結構很棒。只要考慮你的應用程式對其他 QPGG 的依賴,並從它們的啟動腳本偷一點內容,幾乎什麼都能跑起來。我有一個簡單的 ClamD 範例,是用在我的 Xeams 上的:

此致

Mandragor59

***** 沒有問題,只有挑戰 *****

#!/bin/sh
# 名稱:/share/CACHEDEV1_DATA/.qpkg/RunLast/init.d/S10-ClamD_Service
# 確保守護程序在 /var/run 中建立 clamd.pid 檔案,並在 clamd.conf 中修改 Socket 和 IP 以進行流掃描
# 目的:此腳本用於啟動、停止及重啟 ClamD 服務。
# 作者:Mandragor59 (A.Lechte)
# ------------------------------------------------------------------------------

# 設定 ClamAV 環境變數

export QNAP_QPKG=ClamAV
QPKG_NAME=$QNAP_QPKG
QPKG_DIR=`/sbin/getcfg $QPKG_NAME Install_Path -d NULL -f /etc/config/qpkg.conf`

# 若未安裝則不執行任何動作

if [ ! -d ${QPKG_DIR} ]
	then
        exit 1
fi

# 來吧,開始還是不開始

case "$1" in
  
  start)
	
	echo -n $"正在啟動 ClamAV 守護程序:"
	
# 檢查依賴並連結必要檔案(複製自 clamav 啟動程序)

	/bin/ln -sf ${QPKG_DIR}/usr/lib/libclamav.so.9.0.5 /usr/lib/libclamav.so.9.0.5 >/dev/null 2>&1
    /bin/ln -sf ${QPKG_DIR}/usr/lib/libclammspack.so.0.1.0 /usr/lib/libclammspack.so.0.1.0 >/dev/null 2>&1
    /bin/ln -sf ${QPKG_DIR}/usr/lib/libclamunrar.so.9.0.5 /usr/lib/libclamunrar.so.9.0.5 >/dev/null 2>&1
    /bin/ln -sf ${QPKG_DIR}/usr/lib/libclamunrar_iface.so.9.0.5 /usr/lib/libclamunrar_iface.so.9.0.5 >/dev/null 2>&1
    /bin/ln -sf ${QPKG_DIR}/usr/lib/libfreshclam.so.2.0.1 /usr/lib/libfreshclam.so.2.0.1 >/dev/null 2>&1
    /bin/ln -sf ${QPKG_DIR}/usr/lib/libcharset.so.1.0.0 /usr/lib/libcharset.so.1.0.0 >/dev/null 2>&1
	
    /sbin/ldconfig
    
	/bin/ln -sf ${QPKG_DIR}/usr/local/bin/freshclam /usr/local/bin/freshclam >/dev/null 2>&1
    /bin/ln -sf ${QPKG_DIR}/usr/local/bin/clamscan /usr/local/bin/clamscan >/dev/null 2>&1
    /bin/ln -sf ${QPKG_DIR}/usr/local/bin/sigtool /usr/local/bin/sigtool >/dev/null 2>&1
    /bin/ln -sf ${QPKG_DIR}/usr/local/sbin/clamd /usr/local/sbin/clamd >/dev/null 2>&1
    /bin/ln -sf ${QPKG_DIR}/usr/local/bin/clamscan_cli /usr/local/bin/clamscan_cli >/dev/null 2>&1
    /bin/ln -sf ${QPKG_DIR}/usr/local/bin/clamav_cli /usr/local/bin/clamav_cli >/dev/null 2>&1
    /bin/ln -sf ${QPKG_DIR}/etc/init.d/antivirus_qpkg.sh /etc/init.d/antivirus_qpkg.sh >/dev/null 2>&1

# 啟動 ClamD

    /usr/local/sbin/clamd 2>/var/log/clamd.log
	
	echo $"..... 完成。"
	
    ;;
	
  stop)
  
    echo -n $"正在關閉 ClamAV 守護程序:"
	
	killall -9 clamd
	rm /var/run/clamd.pid >/dev/null 2>&1
	
	echo $"..... 完成。"
	
    ;;

  status)
	
    PROC_PID=`cat /var/run/clamd.pid`
	if [ -e /proc/$PROC_PID/status ]
		then
			cat /proc/$PROC_PID/status | grep State
		else
			echo $"ClamAV 守護程序未執行!"
	fi
	
    ;;
	
  *)
  
    echo "用法: $0 {start|stop|status}"
    exit 1
  
	;;

esac

不,這完全正確。因為目前並沒有普遍支援在 QPKG 之後執行腳本。

任何人都可以針對特定套件設計專屬解決方案,但那只對使用該套件的部分社群成員有幫助。:nerd_face:

你的回答是:

「任何人都可以針對特定套件(package)設計專屬解決方案,但這只對使用該套件的部分社群成員有幫助。」:nerd_face:

… 所以這並不完全正確!:winking_face_with_tongue:

嗯……也許我該改成爭論德語語義?德語不是我的主要語言,但照你的做法,我也不該因此卻步。:wink: