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 |
当然,自动登录可以不用 crontab
写成非明文形式
时间规则
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
使配置生效。