Linux 自动化最常用两种方案:Shell 脚本(一次性 / 批量任务) + 定时任务 cron(周期性自动执行),高级场景可以用 Python、Ansible。下面从基础写法、调试、定时、最佳实践、避坑完整讲。
一、Shell 脚本入门(bash)
1. 最简脚本模板 demo.sh
#!/bin/bash
# 上面这行叫 shebang,指定解释器,必须放第一行
# 注释:自动化备份脚本示例
# 打印日志
echo "任务开始执行:$(date)"
# 业务逻辑示例:备份目录
SOURCE="/data"
DEST="/backup"
mkdir -p ${DEST}
tar -zcf ${DEST}/data_$(date +%Y%m%d_%H%M%S).tar.gz ${SOURCE}
# 判断命令是否执行成功
if [ $? -eq 0 ];then
echo "✅ 备份成功"
else
echo "❌ 备份失败"
fi
echo "任务结束:$(date)"
2. 赋予执行权限 & 运行
# 添加可执行权限
chmod +x demo.sh
# 直接运行
./demo.sh
# 或者 bash 执行(不需要x权限)
bash demo.sh
3. 脚本常用核心语法(自动化高频)
# 变量
NAME="test"
echo $NAME
# 日期格式化(文件名打时间戳)
TIME=$(date +%Y%m%d_%H%M%S)
# 判断文件是否存在
if [ -f "/tmp/file.txt" ];then echo "文件存在"; fi
# 循环
for file in /tmp/*.log; do
echo $file
done
# 重定向输出,保存日志(非常重要,定时任务必须写日志)
./demo.sh >> /var/log/demo.log 2>&1
# >> 追加日志;2>&1 标准错误也写入日志
$?:获取上一条命令退出码,0 = 成功,非 0 = 失败,自动化脚本一定要做判断,否则任务失败了你不知道。
二、定时自动执行:cron(Linux 原生)
cron 用来周期性自动跑脚本,是最常用自动化工具。
1. cron 表达式格式
分 时 日 月 周 命令
0-59 0-23 1-31 1-12 0-6(0=周日)
示例:
# 每天凌晨2点执行备份脚本,输出日志
0 2 * * * /root/demo.sh >> /var/log/demo.log 2>&1
2. 编辑 cron 任务
# 编辑当前用户定时任务
crontab -e
# 查看当前用户定时任务
crontab -l
# 删除全部定时任务
crontab -r
⚠️ cron 坑:cron 的环境变量和交互式 shell 不一样! 不要在脚本里依赖
PATH、环境变量,脚本内写全路径(/usr/bin/tar,不要只写 tar)。
3. 系统级 cron(/etc/crontab)
系统全局定时任务,需要 root,支持指定执行用户:
0 2 * * * root /root/demo.sh >> /var/log/demo.log 2>&1
三、其他自动化方案(按需选择)
表格
systemd timer 简要示例(替代 cron)
写服务文件
/etc/systemd/system/mytask.service
[Unit]
Description=自动化备份任务
[Service]
Type=oneshot
ExecStart=/root/demo.sh
timer 文件
/etc/systemd/system/mytask.timer
[Unit]
Description=每天凌晨2点触发
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
systemctl daemon-reload
systemctl enable --now mytask.timer
systemctl list-timers
四、脚本自动化最佳实践(生产环境必看)
全部使用绝对路径:命令、文件路径,避免 cron 环境变量缺失问题
日志记录:标准输出 + 错误输出写入日志,方便排查
增加锁文件,防止重复并发执行(比如脚本执行时间超过周期,cron 重复拉起)
LOCK_FILE="/tmp/demo.lock"
if [ -f "${LOCK_FILE}" ];then
echo "脚本正在运行,退出"
exit 1
fi
trap 'rm -f ${LOCK_FILE}' EXIT
touch ${LOCK_FILE}
trap:脚本退出时自动删除锁文件。
设置脚本超时、失败告警 脚本执行失败,可以发送邮件 / 企业微信机器人通知。
脚本开头加 set 严格模式(调试、防坑)
#!/bin/bash
set -euo pipefail
# set -e:遇到错误直接退出脚本
# set -u:使用未定义变量直接报错
# set -o pipefail:管道命令失败也返回错误码
注意:
set -e有部分场景会失效,复杂脚本要谨慎使用。
先手动测试脚本,再放入定时任务,不要直接上 cron。
五、调试技巧
# 调试shell脚本,打印每一行执行命令
bash -x demo.sh
# 查看cron日志(不同系统路径)
# Debian/Ubuntu
tail -f /var/log/cron
# CentOS/RHEL
tail -f /var/log/cron
六、Python 自动化示例(适合复杂业务)
auto_task.py
#!/usr/bin/env python3
import time
import subprocess
from pathlib import Path
def backup():
src = Path("/data")
dest = Path("/backup")
dest.mkdir(exist_ok=True)
cmd = ["tar", "-zcf", f"{dest}/data_{time.strftime('%Y%m%d_%H%M%S')}.tar.gz", str(src)]
res = subprocess.run(cmd)
if res.returncode == 0:
print("备份成功")
else:
print("备份失败")
if __name__ == "__main__":
backup()
chmod +x auto_task.py
# cron里同样可以直接调用
0 2 * * * /usr/bin/python3 /root/auto_task.py >> /var/log/py_task.log 2>&1
七、什么时候用什么?
单台机器简单定时任务:bash + cron
单台、复杂逻辑(数据库、http 接口):Python
多台服务器批量运维:Ansible
需要重试、依赖系统状态、现代系统:systemd timer
本文原创作者:易君召,详见:https://www.yijunzhao.cc/about,转载请注明出处。
原文链接
欢迎访问