内置30+脚本,「定时工具」让NAS更牛,极空间部署CronMaster
想要 NAS 玩得好,任务计划少不了。
目前国内的主流 NAS 品牌在任务计划这个功能上都有所欠缺,一方面是出于安全性的考虑,以免家庭用户误操作导致系统级任务失效,另一方面则是这个功能的需求相比于家庭娱乐场景优先级不高,所以迟迟没有开发。
不过任务计划功能不上线,不代表 NAS 用户没需求。对任何使用 NAS 久一点的用户来说,任务计划都是一个需求优先级非常高的功能,它可以让我们对 NAS 的掌控力更强,并且也支持让我们配置更多的自定义脚本、任务计划,来满足个人使用需求。
今天,Cherry 为大家带来的是一款基于 Docker 的任务计划管理面板 —— CronMaster,通过这个项目,原本我们需要手动完成的任务都可以通过 Cron 自动完成,对于追求自动化体验的 NAS 用户来说效果极佳。
项目特征:
• 现代 UI:美观、响应式界面,支持暗/亮模式。
• 系统信息 : 显示主机名、IP 地址、运行时间、内存、网络和 CPU 信息。
• 计划任务管理 : 查看、创建和删除带注释的计划任务。
• 脚本管理 : 随时查看、创建和删除 bash 脚本,用于在您的计划任务中使用。
• 任务执行日志记录 : 可选的 cron 任务日志记录功能,支持自动清理,捕获标准输出、标准错误、退出代码和时间戳。
• 实时更新 (SSE): 支持长时间运行任务的实时状态更新和日志实时流式传输(当启用日志记录时)。
• 智能任务执行 : 启用日志记录的任务在后台运行并支持实时更新,未启用日志记录的任务同步执行,超时时间为 5 分钟。
• 身份验证 : 支持安全的基于密码和/或 OIDC (SSO) 的身份验证,并具备适当的会话管理。
• REST API: 完整的 REST API,支持可选的 API 密钥认证,用于外部集成。
• Docker 支持 : 完全基于 Docker 容器运行。
• 简易设置 : 常见 cron 计划的快速预设。

一、部署 Cronmaster
本次部署使用极空间私有云 Z4 Pro,这台 4盘位设备配备了 N97 处理器,兼顾性能和低功耗,是新手入门4盘位的一台很不错的选择。如果更追求性价比和扩展需求,极空间Q4/Q4 双擎版也是不错的选择。
在极空间 ZOS 系统里,官方有很多默认的监控监控脚本,这些服务都关乎到 ZOS 系统的稳定运行,所以这里要提醒大家千万不要去修改这些监控脚本!!千万不要!
打开极空间 Docker 应用,新建一个 Compose项目,将我下面的代码直接复制到代码框内。

🔻yaml 代码
services:
cronmaster:
image: ghcr.io/fccview/cronmaster:latest
container_name: cronmaster
user: "root"
ports:
# ⭐下面这个是外网访问端口,自己修改
- "40123:3000"
environment:
- NODE_ENV=production
- DOCKER=true
- NEXT_PUBLIC_CLOCK_UPDATE_INTERVAL=30000
# ⭐下面这个是管理员密码,自己修改
- AUTH_PASSWORD=Cherry4nas@666
- HOST_CRONTAB_USER=root
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- 路径/scripts:/app/scripts
- 路径/data:/app/data
- 路径/snippets:/app/snippets
pid: "host"
privileged: true
restart: always
init: true
注意到 yaml 代码里有三个【路径】,这个是需要我们进行替换的。替换方法很简单,点击代码框上方的【查询路径】,在你最常用的文件夹下新建一个【cronmaster】文件夹,然后进入后点击复制路径(格式一般是 /tmp/zfsv3/sata14/电话/data/docker/cronmaster),将复制出来的路径进行替换。

由于该项目下载的镜像包是 ghcr.io 的镜像,所以下载可能会有点慢。可以通过自定义拉取或者加速库来解决。

容器启动完成以后,在容器标签页下可以通过远程访问直接打开管理页面,也可以通过【配置远程访问】设置容器快捷方式,这样在PC桌面、手机端都可以直接打开。
整个过程无需你家里有公网 IP 就可以随时访问,相当不错。

二、Cronmaster 使用及常用脚本分享
管理员的登录密码,就是我们在 yaml 里配置的密码,如果忘记修改了,那默认的是Cherry4nas@666

先来看界面风格,CronMaster 这个项目分为左右两栏。
左侧是当前 NAS (服务器)的性能信息,包括运行时间、内存使用量、CPU使用率、GPU信息、网络流量、性能一览,所有的硬件信息都是30秒刷新一次,相对还是比较实时、准确的。

右侧的话,是当前 NAS 的 Cron 任务列表,支持详细展示和简略展示。
🔻详细展示包括了 定时时间(含Cron 翻译成自然语言)、脚本路径、运行用户等。

🔻简略信息的话只包括 Cron、脚本路径。

功能上,主要功能包括筛选、备份、新建Cron;然后单独每一个 Cron 支持启停改删等常用功能,还提供了快速开启日志归档、复制任务的快捷指令。

新建的任务计划,支持 Command 指令,以及复杂的脚本指令。前者就不多介绍了,主要我看来介绍一下后者。

在复杂脚本指令里,允许用户编Shell脚本,并且内置了近 30种兼容 NAS 的脚本可以直接导入。
这些脚本包括但不限于:影音文件移动、文件复制、重启服务、清除日志、数据库备份、遍历文件、检查 SSL、检查端口、备份文件、rsync 同步等等。

1️⃣清理极空间悬垂镜像
#!/bin/bash
# --- 配置区 ---
# 定义需要保留的 Docker 镜像名称或 ID (用空格分隔)
# 建议保留重要的基础镜像,如: alpine, ubuntu, busybox 等
EXCLUDED_IMAGES=(
"nginx:latest"
"mariadb:10.5"
"my-important-app:v1"
)
# 定义日志文件路径
LOG_FILE="/var/log/docker_cleanup.log"
# ----------------
echo "--- $(date) ---" >> "$LOG_FILE"
echo "开始检查并清理无用 Docker 镜像..." >> "$LOG_FILE"
# 1. 获取所有当前运行容器所使用的镜像ID
RUNNING_IMAGE_IDS=$(docker ps -a --format "{{.Image}}" | xargs -I {} docker images --filter "reference={}" -q | sort -u)
# 2. 获取所有镜像ID
ALL_IMAGE_IDS=$(docker images -q)
# 3. 找出所有未被使用的镜像ID
UNUSED_IMAGE_IDS=""
for image_id in $ALL_IMAGE_IDS; do
IS_USED=false
for running_id in $RUNNING_IMAGE_IDS; do
if [ "$image_id" == "$running_id" ]; then
IS_USED=true
break
fi
done
if ! $IS_USED; then
# 4. 检查是否在排除列表内
IS_EXCLUDED=false
for excluded_ref in "${EXCLUDED_IMAGES[@]}"; do
# 检查镜像引用名称是否匹配
if docker images --format "{{.Repository}}:{{.Tag}}" | grep -q "$image_id.*$excluded_ref"; then
IS_EXCLUDED=true
break
fi
# 检查镜像ID是否匹配(尽管ID不常用于排除,但留作备用)
if [ "$image_id" == "$excluded_ref" ]; then
IS_EXCLUDED=true
break
fi
done
if ! $IS_EXCLUDED; then
UNUSED_IMAGE_IDS="$UNUSED_IMAGE_IDS $image_id"
fi
fi
done
if [ -z "$UNUSED_IMAGE_IDS" ]; then
echo "未发现需要清理的无用镜像。" >> "$LOG_FILE"
else
echo "以下镜像将被清理 (ID): $UNUSED_IMAGE_IDS" >> "$LOG_FILE"
# 执行清理操作
docker rmi $UNUSED_IMAGE_IDS >> "$LOG_FILE" 2>&1
echo "清理完成。" >> "$LOG_FILE"
fi
echo "--- 清理任务结束 ---" >> "$LOG_FILE"
2️⃣内存过低,自动重启虚拟机、docker
#!/bin/bash
# --- 配置区 ---
# 内存使用率阈值(百分比)
MEMORY_THRESHOLD=85
# 重启目标列表 (按优先级从高到低排列)
# 1. Docker 容器名称列表 (例如: "qbit" "portainer")
DOCKER_TARGETS=("my-heavy-container1" "my-heavy-container2")
# 2. 虚拟机名称列表 (如果极空间支持 QEMU/KVM 命令,可能需要调整)
# 假设使用 virsh (QEMU/KVM 管理工具)
VM_TARGETS=("win10-vm" "ubuntu-server")
# 定义日志文件路径
LOG_FILE="/var/log/memory_monitor.log"
# ----------------
# 获取当前内存使用率 (百分比)
# Linux 命令: free | grep Mem | awk '{print ($3/$2) * 100}'
MEMORY_USAGE=$(free | grep Mem | awk '{print int(($3/$2) * 100)}')
echo "--- $(date) ---" >> "$LOG_FILE"
echo "当前内存使用率: $MEMORY_USAGE%" >> "$LOG_FILE"
if [ "$MEMORY_USAGE" -ge "$MEMORY_THRESHOLD" ]; then
echo "!!! 警告:内存使用率 ($MEMORY_USAGE%) 超过阈值 ($MEMORY_THRESHOLD%),开始执行应急重启..." >> "$LOG_FILE"
# --- 应急措施 1: 重启 Docker 容器 ---
for container in "${DOCKER_TARGETS[@]}"; do
echo "尝试重启 Docker 容器: $container" >> "$LOG_FILE"
# 检查容器是否存在且正在运行
if docker ps -a --format "{{.Names}}" | grep -q "^$container$"; then
docker restart "$container" >> "$LOG_FILE" 2>&1
echo "容器 $container 已重启。" >> "$LOG_FILE"
# 重启一个目标后,等待几秒钟让内存释放,然后退出脚本
sleep 10
exit 0
else
echo "容器 $container 未找到或未运行,跳过。" >> "$LOG_FILE"
fi
done
# --- 应急措施 2: 重启虚拟机 ---
# 注意: 极空间环境可能不支持 virsh,请根据实际情况调整
for vm_name in "${VM_TARGETS[@]}"; do
echo "尝试重启虚拟机: $vm_name" >> "$LOG_FILE"
# 假设使用 virsh 命令
if command -v virsh &> /dev/null; then
# 优雅关机再启动,或者直接重启
virsh shutdown "$vm_name"
sleep 30 # 等待关机
virsh start "$vm_name" >> "$LOG_FILE" 2>&1
echo "虚拟机 $vm_name 已尝试重启。" >> "$LOG_FILE"
exit 0
else
echo "virsh 命令不存在,无法重启虚拟机 $vm_name" >> "$LOG_FILE"
exit 0
fi
done
else
echo "内存使用率正常,无需操作。" >> "$LOG_FILE"
fi
总结
CronMaster 的部署,可以说是 NAS 私有云产品功能补充的一大助力,将极大的提高 NAS 用户对 NAS 的操作能力;同时可视化的界面和脚本编辑界面,则可以让我们更好的管理任务计划、脚本,把很多 NAS 系统无法体现的功能通过任务计划来执行。
最后再次提醒,ZOS 默认拥有 10条 监控任务,请务必不要动,否则会造成系统功能的损坏!!
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

可爱的小cherry
校验提示文案
哈利波特别特别大
校验提示文案
小树熊
校验提示文案
小树熊
校验提示文案
哈利波特别特别大
校验提示文案
可爱的小cherry
校验提示文案