CodeGym /课程 /Docker SELF /编写简单的bash脚本用于通过cron自动化任务

编写简单的bash脚本用于通过cron自动化任务

Docker SELF
第 3 级 , 课程 6
可用

编写简单的bash脚本用于通过cron自动化任务

1. 任务定义

今天我们要写一个真实的脚本,它可以检查网站的可访问性并将结果写入日志文件,然后使用 cron 来自动化其运行。

我们想要做什么?

我们将创建一个 bash 脚本,它会:

  1. 使用 ping 检查指定网站的可访问性。
  2. 将检查结果写入日志文件,包括时间和日期。
  3. 自动每5分钟运行这个脚本,使用 cron

为什么这很重要?

在现实世界中,监控网站和服务器的可访问性是系统管理员的关键任务之一。例如,如果你的网站(或服务器)突然没有响应,你希望尽快知道这种情况。这种场景不仅对监控有用,同样适用于面试或者实际工作中。


2. 第一步:写一个简单的 bash 脚本

我们先写一个基础的 bash 脚本。这是它的功能的逐步解释:

  1. 我们会定义一个需要检查的网站地址。
  2. ping 尝试给服务器发送请求。
  3. 检查是否返回了可用的响应。
  4. 把结果保存到日志文件。

现在让我们创建一个文件 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

代码解释:

  1. #!/bin/bash — 指明这个脚本要用 Bash 来执行。
  2. WEBSITE="example.com" — 需要检查的网站地址。你可以把 example.com 替换成你想监控的任何网站或服务器。
  3. ping -c 1 $WEBSITE — 给指定的网站发送一个 (-c 1) 数据包。如果网站有回应,这个命令会以代码 0 结束。如果没有回应,会有错误。
  4. &> /dev/null — 把标准输出和错误输出都定向到“黑洞”(我们不想在控制台看到 ping 的输出)。
  5. $(date) — 在消息里添加当前的日期和时间。
  6. >> $LOG_FILE — 把结果附加到日志文件的末尾。

3. 第 2 步:手动运行脚本

在自动化脚本执行之前,我们先检查它是否正常工作。

  1. 将脚本保存为文件 site_check.sh

  2. 赋予其可执行权限:

    chmod +x site_check.sh
    
  3. 运行脚本:

    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. 常见问题和错误的解析

  1. Ping 返回错误 'Permission denied'

    如果你用普通用户运行脚本,可能权限不够。用 sudo 运行脚本或者给脚本加执行权限。

  2. 日志文件没创建出来

    确认日志文件的路径 (/var/log/site_status.log) 是否正确,并确保你的用户有写入该目录的权限。如果没有文件,可以手动创建,用以下命令:

    sudo touch /var/log/site_status.log
    sudo chmod 666 /var/log/site_status.log
    
  3. cron 没有运行脚本

    检查 cron 服务是否在运行:

    sudo systemctl status cron
    

    状态应该是 active (running)。如果它停了,启动服务:

    sudo systemctl start cron
    
  4. 脚本无法由 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 工程师和系统管理员来说特别重要。

1
Опрос
Linux服务,  3 уровень,  6 лекция
недоступен
Linux服务
Linux服务
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION