-
什么是 crond?
crond 是 Unix/Linux 系统中的一个守护进程(daemon),负责管理和执行定时任务。“cron” 来源于希腊语 chronos,意为"时间"。 -
cron 任务:
这些是被设置为在特定时间或间隔运行的命令或脚本。例如,你可以设置一个任务每天凌晨 3 点备份数据。 -
crontab:
这是存储 cron 任务的配置文件。每个用户可以有自己的 crontab 文件。系统级的 crontab 通常位于 /etc/crontab。 -
crontab 语法:
典型的 crontab 条目格式为:* * * * * command_to_execute
五个星号分别代表:分钟(0-59) 小时(0-23) 日(1-31) 月(1-12) 星期几(0-7)
5. crond 的启动和停止:
- 启动:通常使用
service crond start
或/usr/sbin/crond
- 停止:使用
service crond stop
或pkill crond
- 重启:
service crond restart
-
为什么要重启 crond:
- 应用新的配置:修改 crontab 后,有时需要重启 crond 以确保更改生效。
- 解决问题:如果 crond 行为异常,重启可能会解决问题。
- 系统更新:系统更新后可能需要重启 crond。
-
编辑 crontab:
使用crontab -e
命令可以编辑当前用户的 crontab 文件。 -
查看 crontab:
使用crontab -l
可以列出当前用户的所有 cron 任务。 -
cron 日志:
cron 任务的执行通常会记录在系统日志中,如 /var/log/cron。 -
安全性:
由于 cron 任务可以在后台自动执行,确保只有授权用户能够创建或修改 cron 任务很重要。 -
环境变量:
cron 任务在执行时可能没有完整的环境变量,所以在脚本中最好使用绝对路径。
【示例】
echo "0 0 * * * find /log/ -mtime $limit_time -name \"*.gz\" -exec rm -rf {} \;" >> /var/spool/cron/root
这行代码可以分成几个部分来理解:
-
echo 命令:
用于输出字符串。在这里,它用来将一个新的 cron 任务添加到 crontab 文件中。 -
cron 时间语法 “0 0 * * *”:
- 第一个 0:分钟(0-59)
- 第二个 0:小时(0-23)
- 第一个 *:日期(1-31)
- 第二个 *:月份(1-12)
- 第三个 *:星期几(0-7,其中 0 和 7 都表示星期日)
这个模式表示每天午夜(00:00)执行。
-
find 命令:
用于在文件系统中搜索文件。- /log/:搜索的起始目录
- -mtime $limit_time:查找修改时间超过 l i m i t t i m e 天的文件 ( limit_time 天的文件 ( limittime天的文件(limit_time 是一个变量,其值在脚本的其他地方定义)
- -name “*.gz”:查找文件名匹配 *.gz 模式的文件(即所有 .gz 结尾的文件)
-
-exec 选项:
允许对 find 命令的每个结果执行一个命令。 -
rm -rf {} ;:
- rm:删除文件命令
- -r:递归删除(用于目录)
- -f:强制删除,不提示
- {}:是一个占位符,代表 find 命令的每个结果
- ;:表示 -exec 命令的结束
-
/var/spool/cron/root:
-追加重定向操作符,将输出追加到指定文件的末尾
-/var/spool/cron/root:root 用户的 crontab 文件路径
综合起来,这行代码的作用是:
添加一个 cron 任务到 root 用户的 crontab 中,该任务会在每天午夜执行。它会查找 /log/ 目录下所有修改时间超过 $limit_time 天的 .gz 文件,并删除它们。
重要语法点:
- cron 时间语法:使用五个字段来指定执行时间。
- find 命令:强大的文件搜索工具,可以基于多种条件搜索文件。
- -exec 选项:允许对 find 的结果执行操作。
- 转义字符 ():在 echo 命令中使用 \ 来转义引号,确保它们被正确解释。
- 重定向操作符 (>>):用于将输出追加到文件。
【示例】
其中\"*.gz\"为什么有\,这个\起什么作用
在 \"*.gz\"
中,反斜杠 \ 被用作转义字符。它的作用是:
-
保护引号:
反斜杠 \ 告诉 shell 不要特殊处理紧随其后的引号 ",而是将其视为普通字符。 -
防止提前解释:
如果不使用 \,外层的 echo 命令可能会尝试解释或展开 *.gz,这可能导致意外的行为。 -
保持字面值:
通过转义,我们确保 “*.gz” 作为字面字符串被传递给 find 命令,而不是被 shell 提前解释。 -
多层解释:
这行代码涉及多层命令解释(echo 命令、cron 任务、find 命令),使用 \ 可以确保 *.gz 模式正确地传递到最终的 find 命令。
为什么这很重要?
- 如果不使用 \,shell 可能会在 echo 命令执行时就展开 *.gz,而不是在 cron 任务实际运行时展开。
- 在 crontab 环境中,没有转义的 * 可能会被错误解释。
- 转义确保了 find 命令接收到准确的 “*.gz” 模式,而不是已经被展开或修改的版本。
比较:
- 不转义:
"*.gz"
- 可能在 echo 执行时就被展开。 - 转义:
\"*.gz\"
- 保证作为字面字符串 “*.gz” 被传递给 find 命令。
【示例】
# Flush black box to disk
sed -i '/\/proc\/kbox\/regions\/\* \/log\/kbox\//d' /var/spool/cron/root
echo "0 0 * * * cp -rf /proc/kbox/regions/* /log/kbox/" >> /var/spool/cron/root
这段代码的主要目的是设置一个定时任务,用于定期将某些系统数据(可能是黑匣子数据)从内存复制到磁盘上。让我们逐行分析:
-
sed -i '/\/proc\/kbox\/regions\/\* \/log\/kbox\//d' /var/spool/cron/root
这行使用 sed 命令来修改 root 用户的 crontab 文件。
sed
: 流编辑器,用于修改文本文件。-i
: 直接修改文件,而不是输出到标准输出。/\/proc\/kbox\/regions\/\* \/log\/kbox\//d
: 这是 sed 的模式匹配和操作指令。- 斜杠
/
之间的是要匹配的模式。 - 很多斜杠都被转义了 (
\/
),因为它们是路径的一部分。 d
指令表示删除匹配这个模式的行。
- 斜杠
作用:删除 crontab 中任何包含 “/proc/kbox/regions/* /log/kbox/” 的行。这是为了确保不会有重复的任务。
-
echo "0 0 * * * cp -rf /proc/kbox/regions/* /log/kbox/" >> /var/spool/cron/root
这行添加新的 cron 任务到 root 的 crontab 文件中。
0 0 * * *
: cron 时间表达式,表示每天午夜执行。cp -rf /proc/kbox/regions/* /log/kbox/
: 实际执行的命令。cp
: 复制命令。-r
: 递归复制,用于复制目录及其内容。-f
: 强制复制,不提示覆盖。/proc/kbox/regions/*
: 源路径,复制这个目录下的所有内容。/log/kbox/
: 目标路径,复制到这个目录。
作用:添加一个每天午夜执行的任务,将 /proc/kbox/regions/ 目录下的所有内容复制到 /log/kbox/ 目录。
综合解释:
-
数据同步:这段代码设置了一个每日任务,将 /proc/kbox/regions/ 下的数据复制到 /log/kbox/。
-
系统监控:/proc 目录通常包含系统和进程信息。这个任务可能是在保存某种系统状态或日志数据。
-
黑匣子功能:从 “Flush black box to disk” 的注释来看,这可能是一个类似飞机黑匣子的功能,定期保存重要的系统状态数据。
-
定期备份:通过每天执行,确保即使系统崩溃,也能保留最近一天的数据。
-
安全性:这个任务在 root 的 crontab 中运行,表明它需要高级权限,可能涉及敏感或重要的系统数据。
-
维护性:先删除旧任务再添加新任务,确保不会累积重复的任务,保持 crontab 的清洁和可维护性。