唠唠闲话
自动化脚本的用途广泛,比如自动挂载磁盘,自动登录校园网等。本篇将介绍 crontab
这一自动脚本执行工具。
Crontab 简介
crontab
是类 Unix 操作系统中用于设置周期性执行任务的工具。crontab
(代表 “cron table”)允许用户编辑一个表格,即 crontab 文件,来定义任务的执行时间表。Cron 是一个系统守护进程,按照 crontab 文件中的定义定时执行任务。
注意:首次使用
crontab
时会提示选择编辑器,若需更改默认编辑器,可使用select-editor
命令。
使用案例
下边来看两个 crontab
的实例。
示例一:获取环境信息
本例获取 crontab
的默认执行环境,方便后续更灵活地编写脚本。
在 /srv/network
目录下创建并配置脚本: test_env.sh
sudo mkdir -p /srv/network
sudo chown -R $USER:$USER /srv/network
cd /srv/network
echo -e '#!/bin/bash\ndate >> test.log\nenv >> test.log' > test_env.sh
chmod +x test_env.sh
编辑 crontab 以每分钟执行脚本:
crontab -e
# 添加以下行
*/1 * * * * /srv/network/test_env.sh
日志文件 test.log
将每分钟更新一次,记录 crontab
的环境信息,例如:
Sun May 26 21:34:01 CST 2024
SHELL=/bin/sh
PWD=/home/rex
LOGNAME=rex
HOME=/home/rex
LANG=en_US.UTF-8
SHLVL=1
LC_TIME=en_DK.UTF-8
PATH=/usr/bin:/bin
_=/usr/bin/env
容易发现,PATH
路径比起默认登录的少很多,比如 $HOME/.local.bin
。所以很多在登录时可用的命令,通过 crontab
无法直接执行,需手动更新 PATH
路径。
示例二:自动登录校园网
假设 mylogin
是登录脚本,存储在 $HOME/.local/bin
中。
在 /srv/network
目录下创建 autologin.sh
脚本:
#!/bin/bash
log_file="/srv/network/net.log"
# 更新 PATH 路径
export PATH=$PATH:$HOME/.local/bin
if ! ping -c 2 -w 3 www.baidu.com > /dev/null; then
echo "网络异常:$(date)" >> $log_file
# 随机等待 1-6 秒
sleep $((1 + $RANDOM % 6))
# 将登录日志和错误信息记录到文件
echo "执行登录脚本:$(mylogin 2>&1)" >> $log_file
else
echo "网络正常:$(date)" >> $log_file
fi
编辑 crontab 以每 10 分钟检查并尝试登录:
crontab -e
# 添加以下行
*/10 * * * * /srv/network/autologin.sh
时间规则
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
服务管理系统日志。日志文件定期轮转以避免过大。
cd /etc/logrotate.d
cat rsyslog
内容形如:
/var/log/syslog
/var/log/kern.log
...
/var/log/debug
/var/log/messages
{
rotate 4
weekly
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
大括号 {}
前是被作用文件,{}
内的是具体的作用规则。在 {}
前添加新的文件路径即可。
规则说明:
rotate 4
:保留最新的4个轮替文件。超过这个数量的旧文件会被删除。weekly
:日志文件将每周轮替一次。missingok
:如果日志文件不存在,不会报错。notifempty
:如果日志文件为空,不进行轮替。compress
:轮替的日志文件将被压缩(默认使用gzip)。delaycompress
:压缩操作将延迟到下一次轮替周期。sharedscripts
:这个选项意味着postrotate
脚本将只执行一次,而不是对每个日志文件执行一次。postrotate
/endscript
:这是一对指令,定义了在日志文件轮替后需要执行的脚本。
执行 sudo logrotate -f /etc/logrotate.conf
使配置生效。