說明
這是一個一次性執行的 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
在 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 之後執行腳本。
任何人都可以針對特定套件設計專屬解決方案,但那只對使用該套件的部分社群成員有幫助。
你的回答是:
「任何人都可以針對特定套件(package)設計專屬解決方案,但這只對使用該套件的部分社群成員有幫助。」
… 所以這並不完全正確!
嗯……也許我該改成爭論德語語義?德語不是我的主要語言,但照你的做法,我也不該因此卻步。