当前位置:首页>Linux>【Linux 运维体系 · 第 13 篇】定时任务与自动化 —— 让服务器自己干活

【Linux 运维体系 · 第 13 篇】定时任务与自动化 —— 让服务器自己干活

  • 2026-10-11 07:18:41
【Linux 运维体系 · 第 13 篇】定时任务与自动化 —— 让服务器自己干活

本篇目标

  • • 理解定时任务的工作原理
  • • 使用 Crontab 编写定时任务
  • • 实现自动备份和自动巡检
  • • 学会排查定时任务故障
  • • 建立运维自动化思维

一、为什么需要定时任务?

作为运维,你很快会发现很多工作都在重复:

  • • 每天备份数据库
  • • 每天清理日志
  • • 每小时检查服务状态
  • • 每隔几分钟监控网站
  • • 定期同步文件

刚开始服务器只有一台的时候,你可能觉得手动执行也没什么问题。

但随着业务增长:

服务器越来越多

↓

任务越来越多

↓

人工执行越来越容易遗漏

↓

最终出现事故

这时候就需要把这些重复工作交给系统自动完成。

这也是自动化运维的第一步。


二、什么是 Cron?

Linux 中最常见的定时任务服务叫:

Cron

它会一直在后台运行。

当时间满足设定条件时:

执行指定命令

↓

记录执行结果

↓

等待下一次执行

查看服务状态:

# Ubuntu / Debian
systemctl status cron

# CentOS / RHEL

systemctl status crond

启动服务:

# Ubuntu / Debian
systemctl start cron

# CentOS / RHEL

systemctl start crond

如果服务没有运行:

所有定时任务都不会执行

因此遇到问题时,第一步永远先检查 Cron 服务状态。


三、Crontab 基础命令

Crontab 用于管理当前用户的定时任务。

常用命令如下:

# 编辑定时任务
crontab -e

# 查看定时任务

crontab -l

# 删除所有定时任务(危险操作)

crontab -r

运维日常最常用的是:

crontab -e

因为绝大部分任务都是通过它来配置的。


四、Crontab 时间格式

一条定时任务通常长这样:

0 2 * * * /usr/local/bin/backup.sh

格式为:

分 时 日 月 周 命令

刚接触时不用死记。

记住几个最常见场景即可。

# 每小时执行一次
0 * * * * command

# 每天凌晨2点执行

0 2 * * * command

# 每5分钟执行一次

*/5 * * * * command

# 每周一凌晨3点执行

0 3 * * 1 command

# 每月1号执行

0 0 1 * * command

实际生产环境中:

每天执行

每小时执行

每5分钟执行

占了绝大多数场景。


五、第一个定时任务

先创建一个简单测试脚本:

#!/bin/bash

echo
 "$(date) cron test" >> /tmp/cron.log

保存为:

/tmp/test.sh

赋予执行权限:

chmod +x /tmp/test.sh

然后编辑 Crontab:

crontab -e

添加:

# 每分钟执行一次
* * * * * /tmp/test.sh

等待一分钟后查看:

cat /tmp/cron.log

如果看到类似内容:

Fri Jun 12 20:01:01 JST 2026 cron test

说明:

Cron 服务正常

↓

任务执行成功

六、为什么脚本手动能运行,定时任务却失败?

这是运维新人最容易踩的坑之一。

很多时候:

bash backup.sh

执行正常。

但放进 Crontab 后:

完全没有效果

通常是以下几个原因。

环境变量不同

Cron 的运行环境非常简单。

例如:

docker ps

手动执行正常。

Cron 中可能提示:

docker: command not found

解决方法:

# 查找命令完整路径
which
 docker

# 使用绝对路径

/usr/bin/docker ps

工作目录不同

很多脚本喜欢这样写:

./backup.sql

Cron 执行时可能找不到文件。

正确做法:

/backup/backup.sql

尽量使用绝对路径。


权限不足

检查:

ls -l script.sh

确保:

chmod +x script.sh

七、实战:数据库自动备份

上一篇我们已经编写了:

/usr/local/bin/mysql_backup.sh

现在只需要把它交给 Cron。

编辑任务:

crontab -e

添加:

# 每天凌晨2点备份数据库
0 2 * * * /usr/local/bin/mysql_backup.sh

为了方便排错,建议记录日志:

# 记录标准输出和错误输出
0 2 * * * /usr/local/bin/mysql_backup.sh >> /var/log/mysql_backup.log 2>&1

八、实战:网站状态监控

需求:

每5分钟检查一次网站是否正常。

创建脚本:

#!/bin/bash

URL="https://example.com"

STATUS=$(curl -s \
-o /dev/null \
-w "%{http_code}" \
${URL}
)

if
 [ "$STATUS" != "200" ]; then

    echo
 "$(date) 网站异常:${STATUS}" \
    >> /var/log/web_check.log

fi

保存:

/usr/local/bin/check_web.sh

赋权:

chmod +x /usr/local/bin/check_web.sh

添加定时任务:

# 每5分钟检查一次
*/5 * * * * /usr/local/bin/check_web.sh

实现效果:

定时检查

↓

发现异常

↓

记录日志

这已经属于最基础的监控系统了。


九、如何查看 Cron 执行日志?

很多人遇到问题:

任务没执行

↓

不知道原因

其实 Cron 自己会记录日志。

查看相关日志:

# Ubuntu / Debian
grep CRON /var/log/syslog

# CentOS / RHEL

grep CROND /var/log/cron

实时查看:

# Ubuntu / Debian
tail
 -f /var/log/syslog

# CentOS / RHEL

tail
 -f /var/log/cron

记住一个原则:

排错先看日志,不要靠猜。


十一、定时任务最佳实践

生产环境建议遵循以下原则:

使用绝对路径

↓

脚本先手动测试

↓

重要任务记录日志

↓

定期检查执行结果

↓

不要把生产环境当测试环境

例如:

# 推荐
/usr/bin/docker ps

# 不推荐

docker ps

例如:

# 推荐
/backup/mysql.sql

# 不推荐

./mysql.sql

这些看似不起眼的小细节,往往能避免大量故障。


十一、本篇总结

从这一篇开始,我们已经不再只是会执行命令。

而是在逐步学会:

让服务器自动完成工作。

这也是运维从「手工操作」走向「自动化运维」的第一步。

最新文章

随机文章