已切换至秋季配色,取自《小市民系列》,若影响可视性等问题请联系邮件地址 [email protected]

FreeBSD Periodic 系统简介

FreeBSD 的 periodic 实用程序是一款内置系统,用于以 shell 脚本的形式安排和运行定期(每日、每周、每月)维护任务。它们包括系统健康检查、安全审计和清理任务。借助 periodic 的模块化结构,也可以把自定义任务集成到现有框架中。

本文将介绍如何使用系统提供的 periodic 脚本,以及如何集成我们自己的脚本。

periodic 脚本的位置

以下目录包含计划通过 periodic 系统运行的脚本:

  • /etc/periodic/daily/etc/periodic/weekly/etc/periodic/monthly:应在特定周期运行的脚本(例如每周一次)。

  • /etc/periodic/security:与安全相关的检查,例如已启用的防火墙或登录失败情况。

  • /usr/local/etc/periodic/daily/usr/local/etc/periodic/weekly:第三方脚本,通常来自 Ports 或包,也按时间运行。例如,轮转 nginx 日志文件或备份 pkg 文件。

  • /usr/local/etc/periodic/security:来自第三方的安全检查脚本,例如运行 pkg audit 的脚本。

调度本身通过 /etc/crontab 中的以下三行实现:

1       3       *       *       *       root    periodic daily
15      4       *       *       6       root    periodic weekly
30      5       1       *       *       root    periodic monthly

要配置 periodic 系统本身以及应运行的脚本,FreeBSD 提供了单独的配置文件 /etc/periodic.conf。默认情况下,该文件为空或不存在。/etc/defaults/ 目录提供了一个带有详细注释的示例文件。更多信息可参考手册页 periodic.conf(5)

例如,要激活每日备份 /etc/passwd/etc/group 文件(位于 /etc/periodic/200.backup-passwd 脚本中),在 /etc/periodic.conf 添加如下行:

daily_backup_passwd_enable="YES"

不需要提供前缀数字(示例中为 200)。该数字用于在同一类别(这里为 daily)中有多个脚本时控制运行顺序。在配置文件中逐行列出所有需要运行的脚本。

当这些脚本执行时,产生的输出会发送到系统管理员账号(root)。若要将输出重定向到 /var/log 中的文件,可分别为 dailyweeklymonthly 脚本添加以下行:

daily_output=/var/log/daily.log
weekly_output=/var/log/weekly.log
monthly_output=/var/log/monthly.log

文件名可以任意选择,只要不与已有日志文件重名即可。使用这种方法,这些日志文件在过分膨胀时会被轮替。/etc/newsyslog.conf 中的配置会处理上述三个文件的轮替。

添加自定义 periodic 脚本

下面的自定义脚本用于检查系统中所有 ZFS 池的容量是否达到 80%。如果达到阈值,会输出当前容量和对应的池名称:

#!/bin/sh

if [ -r /etc/defaults/periodic.conf ]
then
  . /etc/defaults/periodic.conf
  source_periodic_confs
fi

: ${zfs_pool_usage_enable:="YES"}
: ${zfs_pool_usage_threshold:=80}

[ "$zfs_pool_usage_enable" = "YES" ] || exit 0

echo ""
echo "Checking ZFS pool usage (threshold: ${zfs_pool_usage_threshold}%)..."

zpool list -H -o name,capacity | while read -r pool usage; do
    percent=${usage%%%}  # 移除 '%' 符号
    if [ "${percent}" -ge "${zfs_pool_usage_threshold}" ]; then
        echo "WARNING: ZFS pool '${pool}' is ${percent}% full!"
    else
        echo "OK: ZFS pool '${pool}' is below capacity threshold (${percent}%)."
    fi
done

exit 0

接下来使用提升权限将脚本设为可执行:

chmod +x /etc/periodic/daily/405.zfs_pool_usage

在全局配置文件 /etc/periodic.conf 中激活该脚本,并将阈值降低到 75%:

daily_show_success="YES"
zfs_pool_usage_enable="YES"
zfs_pool_usage_threshold="75"

如果没有 zfs_pool_usage_threshold 这行,脚本会使用默认值 80%。daily_show_success 用于在日志文件中查看脚本输出。如果在测试中将其设为 NO,你将看不到日志输出,而手动执行脚本则正常。

要测试脚本,以 root 权限运行:

periodic daily

该命令会遍历每个 daily 脚本以确定哪些需要运行。完成后,你会在 /var/log/daily.log 文件末尾看到新的输出行。

示例输出:

Checking ZFS pool usage (threshold: 75%)...
OK: ZFS pool 'data' is below capacity threshold (6%).
OK: ZFS pool 'zroot' is below capacity threshold (27%).

编写自定义脚本的建议:

  • 确保脚本运行时间不过长

  • 使用正确的退出码(成功为 0,失败为非零)

  • 减少输出内容,仅保留必要信息,避免日志过快增长

  • 脚本以非交互方式运行,不要等待用户输入或执行需要交互的命令

  • 添加错误处理以捕获异常情况并提示,不要让脚本静默失败

  • 通过手动调用和 periodic 调用分别测试脚本

总结

掌握这些技巧后,你可以向系统添加各种有用的任务。查看上文列出的目录,了解已有功能,避免重复造轮子。此外,安装 Ports 时可查看 /usr/local/etc/periodic 是否提供了 periodic 脚本,它们有特定用途,能很好地融入你的定期任务计划中。

最后更新于