Crontab 实现脚本的自动执行
crontab 简介
自动化脚本的用途广泛,比如开机自动挂载磁盘,自动登录校园网等。
crontab 是 Unix 及类 Unix 操作系统中用于设置周期性执行任务的工具。crontab(代表 “cron table”)允许用户编辑一个表格,即 crontab 文件,来定义任务的执行时间表。Cron 是一个系统守护进程,按照 crontab 文件中的定义定时执行任务。
注意:首次使用
crontab时会提示选择编辑器,若需更改默认编辑器,可使用select-editor命令。
使用案例
下边来看两个 crontab 的实例。
示例一:环境变量信息
为方便后续更灵活地编写脚本,我们先写一个获取 crontab 的默认执行环境信息的脚本。
在 /srv/network 目录下创建并配置脚本: test_env.sh
1 | sudo mkdir -p /srv/network |
编辑 crontab 以每分钟执行脚本:
1 | crontab -e |
日志文件 test.log 将每分钟更新一次,记录 crontab 的环境信息,例如:
1 | Sun May 26 21:34:01 CST 2024 |
容易发现,PATH 路径比起默认登录的少很多,比如 $HOME/.local.bin。所以很多在登录时可用的命令,通过 crontab 无法直接执行,需手动更新 PATH 路径。
示例二:自动登录校园网
现在开始实战,假设 mylogin 是登录脚本,存储在 $HOME/.local/bin 中。
在 /srv/network 目录下创建 autologin.sh 脚本:
1 |
|
编辑 crontab 以每 10 分钟检查并尝试登录:
1 | crontab -e |
当然,用这种方式自动登录的话,需要把密码写成明文形式。如果单纯需要自动登录,可以直接开个 tmux 后台运行:
1 |
|
时间规则
crontab 任务的时间表设置由五个字段组成:分钟、小时、日期、月份、星期几。下表展示了不同设置的含义:
| 分钟 | 小时 | 日期 | 月份 | 星期 | 含义 |
|---|---|---|---|---|---|
* |
* |
* |
* |
* |
每分钟执行一次 |
0 |
0 |
* |
* |
* |
每天凌晨执行 |
0 |
9 |
* |
* |
1 |
每周一上午 9 点执行 |
0 |
12 |
1 |
* |
* |
每月第一天中午执行 |
15 |
* |
* |
* |
* |
每小时的第 15 分钟执行 |
*/15 |
* |
* |
* |
* |
每 15 分钟执行一次 |
0 |
* |
* |
* |
1-5 |
工作日每小时执行一次 |
0 |
0 |
1 |
1 |
* |
每年 1 月 1 日执行 |
日志管理
在 Ubuntu 系统中,默认使用 rsyslog 服务管理系统日志。日志文件定期轮转以避免过大。
1 | cd /etc/logrotate.d |
内容形如:
1 | /var/log/syslog |
大括号 {} 前是被作用文件,{} 内的是具体的作用规则。在 {} 前添加新的文件路径即可。
规则说明:
rotate 4:保留最新的4个轮替文件。超过这个数量的旧文件会被删除。weekly:日志文件将每周轮替一次。missingok:如果日志文件不存在,不会报错。notifempty:如果日志文件为空,不进行轮替。compress:轮替的日志文件将被压缩(默认使用gzip)。delaycompress:压缩操作将延迟到下一次轮替周期。sharedscripts:这个选项意味着postrotate脚本将只执行一次,而不是对每个日志文件执行一次。postrotate/endscript:这是一对指令,定义了在日志文件轮替后需要执行的脚本。
执行 sudo logrotate -f /etc/logrotate.conf 使配置生效。

