编写简单的bash脚本用于通过cron
自动化任务
1. 任务定义
今天我们要写一个真实的脚本,它可以检查网站的可访问性并将结果写入日志文件,然后使用 cron
来自动化其运行。
我们想要做什么?
我们将创建一个 bash 脚本,它会:
- 使用
ping
检查指定网站的可访问性。 - 将检查结果写入日志文件,包括时间和日期。
- 自动每5分钟运行这个脚本,使用
cron
。
为什么这很重要?
在现实世界中,监控网站和服务器的可访问性是系统管理员的关键任务之一。例如,如果你的网站(或服务器)突然没有响应,你希望尽快知道这种情况。这种场景不仅对监控有用,同样适用于面试或者实际工作中。
2. 第一步:写一个简单的 bash 脚本
我们先写一个基础的 bash 脚本。这是它的功能的逐步解释:
- 我们会定义一个需要检查的网站地址。
- 用
ping
尝试给服务器发送请求。 - 检查是否返回了可用的响应。
- 把结果保存到日志文件。
现在让我们创建一个文件 site_check.sh
:
#!/bin/bash
# 定义网站地址
WEBSITE="example.com"
# 记录结果的日志文件
LOG_FILE="/var/log/site_status.log"
# 使用 ping 检查网站的可用性
if ping -c 1 $WEBSITE &> /dev/null; then
# 如果网站可用
echo "$(date): $WEBSITE 是可用的" >> $LOG_FILE
else
# 如果网站不可用
echo "$(date): $WEBSITE 是不可用的" >> $LOG_FILE
fi
代码解释:
#!/bin/bash
— 指明这个脚本要用 Bash 来执行。WEBSITE="example.com"
— 需要检查的网站地址。你可以把example.com
替换成你想监控的任何网站或服务器。ping -c 1 $WEBSITE
— 给指定的网站发送一个 (-c 1
) 数据包。如果网站有回应,这个命令会以代码 0 结束。如果没有回应,会有错误。&> /dev/null
— 把标准输出和错误输出都定向到“黑洞”(我们不想在控制台看到ping
的输出)。$(date)
— 在消息里添加当前的日期和时间。>> $LOG_FILE
— 把结果附加到日志文件的末尾。
3. 第 2 步:手动运行脚本
在自动化脚本执行之前,我们先检查它是否正常工作。
将脚本保存为文件
site_check.sh
。赋予其可执行权限:
chmod +x site_check.sh
运行脚本:
sudo ./site_check.sh
脚本执行完成后,打开文件 /var/log/site_status.log
,确认检查结果已添加到日志中。使用命令:
cat /var/log/site_status.log
如果一切正常,你应该看到类似这样的行:
Mon Oct 30 14:35:22 UTC 2023: example.com is reachable
4. 第3步:用 cron
设置自动运行
我们已经知道 cron
可以用来按照计划运行任务。现在我们来设置 cron
,让我们的脚本每5分钟运行一次。
编辑 crontab
打开 crontab
编辑器:
crontab -e
添加以下行:
*/5 * * * * /path/to/site_check.sh
说明:
*/5
— 表示任务每5分钟执行一次。/path/to/site_check.sh
— 我们脚本的完整路径。确保路径是正确的。比如,如果脚本在用户的主目录下,路径可能类似/home/your_username/site_check.sh
。
保存更改后,cron
会每隔5分钟运行一次脚本。为了确认任务已添加,运行下面的命令:
crontab -l
5. 第四步: 验证 cron
是否正常运行
现在来检查自动化是否正常工作。等待5-10分钟,然后重新打开日志文件:
cat /var/log/site_status.log
你应该会看到每隔5分钟更新的记录。例如:
Mon Oct 30 14:35:22 UTC 2023: example.com 可访问
Mon Oct 30 14:40:22 UTC 2023: example.com 可访问
Mon Oct 30 14:45:22 UTC 2023: example.com 可访问
6. 常见问题和错误的解析
Ping 返回错误 'Permission denied'
如果你用普通用户运行脚本,可能权限不够。用
sudo
运行脚本或者给脚本加执行权限。日志文件没创建出来
确认日志文件的路径 (
/var/log/site_status.log
) 是否正确,并确保你的用户有写入该目录的权限。如果没有文件,可以手动创建,用以下命令:sudo touch /var/log/site_status.log sudo chmod 666 /var/log/site_status.log
cron
没有运行脚本检查
cron
服务是否在运行:sudo systemctl status cron
状态应该是
active (running)
。如果它停了,启动服务:sudo systemctl start cron
脚本无法由 cron 执行,但手动执行正常
确保脚本和所有使用的文件的路径是完整路径。在
cron
任务中,环境变量(比如$PATH
)可能不一样。最好用绝对路径。
7. 优化和额外任务
网站过滤
扩展您的脚本以检查多个网站的可用性。例如:
WEBSITES=("example.com" "google.com" "stackoverflow.com")
for SITE in ${WEBSITES[@]}; do
if ping -c 1 $SITE &> /dev/null; then
echo "$(date): $SITE 是可以访问的" >> $LOG_FILE
else
echo "$(date): $SITE 是不可访问的" >> $LOG_FILE
fi
done
发送通知
添加当网站不可访问时发送通知。例如,使用 mail
命令发送电子邮件:
# 通过电子邮件发送通知
if ! ping -c 1 $WEBSITE &> /dev/null; then
echo "$WEBSITE 不可访问!" | mail -s "网站检查警报" your_email@example.com
fi
循环日志记录
将日志文件的大小限制为例如1MB。如果文件过大,重命名它(类似归档)并开始新的日志记录。
恭喜!现在你知道如何使用 bash 脚本和 cron
来自动化实际任务了。这些技能对 DevOps 工程师和系统管理员来说特别重要。
GO TO FULL VERSION