小易说IT 小易说IT

Linux 自动化任务脚本完整指南

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

三、其他自动化方案(按需选择)

表格

工具

适用场景

bash shell

简单本地脚本、文件处理、系统命令,轻量无需额外安装

Python

复杂逻辑:API 调用、数据库、文本解析、跨平台,推荐复杂任务

systemd timer

替代 cron,支持任务失败自动重试、更精细控制、日志集成 journald

Ansible

多服务器批量自动化,远程批量部署、配置,不用写大量 shell

at

一次性定时任务(比如 1 小时后执行一次)

systemd timer 简要示例(替代 cron)

  1. 写服务文件 /etc/systemd/system/mytask.service

[Unit]
Description=自动化备份任务
[Service]
Type=oneshot
ExecStart=/root/demo.sh
  1. 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

四、脚本自动化最佳实践(生产环境必看)

  1. 全部使用绝对路径:命令、文件路径,避免 cron 环境变量缺失问题

  2. 日志记录:标准输出 + 错误输出写入日志,方便排查

  3. 增加锁文件,防止重复并发执行(比如脚本执行时间超过周期,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:脚本退出时自动删除锁文件。

  1. 设置脚本超时、失败告警 脚本执行失败,可以发送邮件 / 企业微信机器人通知。

  2. 脚本开头加 set 严格模式(调试、防坑)

#!/bin/bash
set -euo pipefail
# set -e:遇到错误直接退出脚本
# set -u:使用未定义变量直接报错
# set -o pipefail:管道命令失败也返回错误码

注意:set -e 有部分场景会失效,复杂脚本要谨慎使用。

  1. 先手动测试脚本,再放入定时任务,不要直接上 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,转载请注明出处。

原文链接 https://www.yijunzhao.cc/archives/linux-automation-task-script-complete-guide

欢迎访问 https://www.yijunzhao.cc/

https://www.yijunzhao.cc/