NAS 上的排程工作:附帶記錄與失敗通知的 cron
Bucket & Code Server IDE 的 Jobs 頁面依 cron 排程執行您的命令,並保留每次執行的記錄。工作失敗時可傳送通知到 QTS 系統記錄;加入服務位址後,也可傳送到 Telegram、Discord、Slack 或電子郵件。
- 排程cron 欄位與下次執行時間
- 命令bash,以 root 執行
- 立即執行執行與記錄
- 內建套件自己的工作
- 通知系統記錄與聊天服務
圖片來自測試 NAS,顯示版本 1.0.0-49 的介面文字。Notifications 圖片中的位址為範例。
01Jobs 頁面
此頁有兩個分頁。Scheduled 列出 cron 工作,包括套件內建工作與各帳號建立的工作。Operations 列出 bvsd 最近執行的 50 項耗時操作,例如安裝與資料搬移,最新的在前。
Scheduled 的每一列顯示工作與擁有者、文字與原始運算式格式的排程、下次執行時間,以及啟用開關。開啟該列可查看命令、執行歷程與記錄。頁面頂端的標籤顯示 NAS 的時區,頁面所有時間都使用此時區。
- 開發人員可建立工作,並修改或刪除自己的工作。管理員可修改所有工作。
- 所有登入帳號都能讀取清單、命令與記錄,檢視者也一樣。
02從零建立工作
- 按下 New job,在 Name 輸入名稱。
- 輸入 Schedule:五個欄位(分 時 日 月 星期)、前面加上秒的六個欄位,或
@daily、@hourly、@every 90m。欄位下方的範例可直接填入。下方方框以文字說明排程,並列出 NAS 時區的下五次執行時間。使用CRON_TZ=Europe/London 0 3 * * *之類的前綴可改用其他時區。 - 在 Command (bash) 輸入您會在終端機執行的內容。多行會視為一份指令稿執行,輸出會成為該次執行的記錄。
- Runs 可選 On the NAS 或您建立的環境;在環境中,命令會看到該系統的工具與程式庫。Working folder 可為相對於資料目錄內
projects/的路徑,或完整路徑;留空代表projects/。環境中只看得到projects/,掛載位置為/projects。 - Timeout in seconds:超過此時間仍在執行的工作會被停止,並標示為逾時。新工作的初始值為 3600;0 表示無上限。When the previous run is still going 可選 Skip this run 或 Run it after the previous one,後者最多只會讓一次執行等待。
- 新工作預設勾選 Notify on failure 與 On。關閉的工作會保留設定,只能手動執行。按下 Create the job。
日光節約時間切換的夜晚,工作遵循 Debian cron 規則。分或時欄位開頭為 * 或 */N 的工作,以及 @hourly 或 @every,都依經過時間執行:秋季在重複的小時內執行兩輪,春季則不會出現跳過的小時。其他工作每個排定時間只執行一次。重複小時內的時間只執行一次,跳過小時內的時間則在切換後立即執行。
03立即執行、執行歷程與記錄
工作對話方塊中的 Run now 會在排程之外立即執行一次,除非該工作仍在執行。對話方塊列出每次執行的開始時間、耗時、結果與結束代碼。選取一次執行,即可在清單下方閱讀記錄。
- 記錄的第一行與最後一行由 bvsd 寫入。第一行列出執行與工作、開始時間,以及由哪個帳號或排程啟動。此處時間為 UTC,執行清單則使用 NAS 時間。最後一行顯示結果與耗時。
- 每個工作保留最近 100 次執行,各自保存輸出的最後 4 KB。每次執行的完整記錄保留 30 天。
- 執行失敗或逾時時,清單中工作旁會出現紅色 last run failed;Overview 的 Jobs 方塊也會將它計入 failing。
- 命令結束後,它啟動的背景處理程序仍會繼續執行。逾時、刪除工作或停止套件時,會向整個處理程序群組傳送 SIGTERM,5 秒後再傳送 SIGKILL。
- Edit 可修改工作。Delete 會停止執行中的工作,並刪除工作、執行歷程與記錄。只有工作擁有者與管理員看得到這些按鈕,其他人只看到 Close。
04內建工作
標示為 built in 的工作屬於 bvsd 本身,擁有者為 system。
| 工作與時間 | 執行內容 |
|---|---|
| 備份 預設為 @daily | 備份 頁面設定的備份,在該頁啟用 Scheduled backups 後執行;排程與開關也由該頁管理 |
| 維護 每日 03:30 | 從資料目錄的 tmp/ 刪除 10 天未變動的項目,並輪替超過 10 MB 的 log/audit.log |
| 清空資源回收筒 每日 03:45 | 刪除移入資料目錄的 trash/ 已超過 7 天的項目:已刪除的儲存庫、bucket 與帳號家目錄 |
| 重新整理工具鏈目錄 每日 04:15 | 取得已簽署的工具鏈目錄,並在簽章有效且版本較新時使用 |
| 輪替 nginx 記錄 每小時第 7 分鐘 | 將超過 20 MB 的 nginx-access.log 或 nginx-error.log 重新命名為 .1,保留五份舊檔,並通知 nginx 重新開啟記錄 |
管理員可修改內建工作的排程、逾時、已有工作執行時的行為及失敗通知,也可將它關閉。名稱、命令、環境與工作資料夾固定不變,且沒有 Delete。
05通知
bvsd 將每則通知寫入 QTS 系統記錄。System 頁面的 Notifications 也可透過 shoutrrr URL 傳送到聊天與郵件服務:Telegram、Discord、Slack、電子郵件、Webhook 等。
- 在 Addresses (shoutrrr URLs) 下按 Add an address,每個服務貼上一個 URL,例如
telegram://<token>@telegram?chats=<chat id>或generic+https://example.com/hook。 - 在 Also sent to the addresses 下取消勾選只應保留在系統記錄中的通知。新安裝預設勾選全部四項。
- 按下 Save。
| 開關 | 通知時機 |
|---|---|
| 工作失敗 | 啟用失敗通知的 cron 工作執行失敗或逾時,或建置、資料搬移、安裝等操作失敗 |
| 備份結束 | 備份、驗證或還原結束,成功也會通知;或排程備份無法啟動 |
| 模組不斷重新啟動 | 處理程序持續結束後重新啟動 |
| 憑證 | 上傳的憑證剩餘有效期不超過 30 天、nginx 改用自我簽署憑證,或 bvsd 建立新的自我簽署憑證 |
| 無,一律傳送 | 啟動時拒絕設定、發現未完成的資料搬移、結束殘留處理程序,或無法寫入設定 |
- 相同主題的通知最多每 10 分鐘傳送一次,系統記錄也適用。下一則會顯示抑制了多少則通知。
- 每個位址分別傳送,時限為 10 秒。傳送失敗時只記錄 URL 的通訊協定部分,因為其餘部分包含權杖。
- 只有管理員能編輯位址與開關。其他帳號可以看到開關及每個 URL 的通訊協定部分。
NAS 管理員也能透過套件的 CLI 通訊端設定位址。傳送的清單會取代先前儲存的位址,開關值則保留:
/usr/bin/bucketvs/bin/curl --unix-socket /usr/bin/bucketvs/var/run/bvsd-cli.sock \
-X PUT -H 'Content-Type: application/json' \
-d '{"notify":{"shoutrrr_urls":["telegram://<token>@telegram?chats=<chat id>"]}}' \
http://bvsd/api/v1/settings
06Root 權限與其他帳號能讀取的內容
- 工作命令以 root 執行,無論在 NAS 上或環境內,也不論由誰建立。開發人員可建立工作,因此能在 NAS 上以 root 執行任何命令。請只將開發人員角色授予您願意給予 NAS root 權限的人。
- 工作只會在擁有者是已啟用的開發人員或管理員時執行(版本 1.0.0-52 起)。若擁有者已停用,或角色為成員或檢視者,每個排定時間都會記錄為略過的執行,並註明原因,例如 its owner ola is disabled;Run now 也會回覆相同原因,執行中的工作則停止。帳號啟用或恢復開發人員角色後,工作會再次執行。刪除帳號會一併刪除其工作、執行歷程與記錄。內建工作不受帳號狀態影響。
- 所有登入帳號,包括檢視者,都能讀取每個工作的命令與執行輸出。請勿將密碼與權杖直接放在命令中:將它們存入資料目錄內
etc/下只有 root 能讀取的檔案(chmod 600),再讓命令讀取該檔案。