插件窝 干货文章 Linux Systemd Crontab入门教程:从基础到进阶

Linux Systemd Crontab入门教程:从基础到进阶

Crontab Systemd service 定时器 230    来源:    2025-04-11

Linux Systemd & Crontab 入门教程:从基础到进阶

第一部分:Systemd 基础

1. Systemd 简介

Systemd 是现代 Linux 系统的主要初始化系统和服务管理器,它取代了传统的 SysVinit 系统。Systemd 提供了更快的启动速度、并行服务启动、服务依赖管理等功能。

2. Systemd 基本命令

# 启动服务
sudo systemctl start service_name

# 停止服务
sudo systemctl stop service_name

# 重启服务
sudo systemctl restart service_name

# 查看服务状态
sudo systemctl status service_name

# 启用服务开机自启
sudo systemctl enable service_name

# 禁用服务开机自启
sudo systemctl disable service_name

# 列出所有已加载的服务
systemctl list-units --type=service

# 列出所有单元文件
systemctl list-unit-files

3. 创建自定义 Systemd 服务

  1. 创建服务文件(通常位于 /etc/systemd/system/
sudo nano /etc/systemd/system/my_custom_service.service
  1. 示例服务文件内容:
[Unit]
Description=My Custom Service
After=network.target

[Service]
Type=simple
User=myuser
ExecStart=/usr/bin/python3 /path/to/your/script.py
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target
  1. 重新加载 systemd 配置:
sudo systemctl daemon-reload
  1. 启动并启用服务:
sudo systemctl start my_custom_service
sudo systemctl enable my_custom_service

第二部分:Crontab 基础

1. Crontab 简介

Cron 是 Linux 系统中用于定时执行任务的守护进程。用户可以通过 crontab 文件来设置定时任务。

2. Crontab 基本用法

# 编辑当前用户的 crontab
crontab -e

# 列出当前用户的 crontab
crontab -l

# 删除当前用户的 crontab
crontab -r

# 以其他用户身份编辑 crontab
sudo crontab -u username -e

3. Crontab 时间格式

Crontab 时间格式由五个字段组成:

* * * * * command_to_execute
│ │ │ │ │
│ │ │ │ └── 星期几 (0 - 6) (0 表示星期日)
│ │ │ └──── 月份 (1 - 12)
│ │ └────── 日 (1 - 31)
│ └──────── 小时 (0 - 23)
└────────── 分钟 (0 - 59)

4. Crontab 示例

# 每天凌晨 2 点执行
0 2 * * * /path/to/command

# 每小时的第 15 分钟执行
15 * * * * /path/to/command

# 每周一上午 8 点执行
0 8 * * 1 /path/to/command

# 每 5 分钟执行一次
*/5 * * * * /path/to/command

# 每月 1 号和 15 号的凌晨 3 点执行
0 3 1,15 * * /path/to/command

第三部分:Systemd 定时器(替代 Crontab 的现代方案)

1. Systemd 定时器简介

Systemd 提供了定时器单元,可以作为 crontab 的替代方案,具有更好的集成性和日志记录功能。

2. 创建 Systemd 定时器

  1. 创建服务文件 /etc/systemd/system/my_backup.service:
[Unit]
Description=My Backup Service

[Service]
Type=oneshot
ExecStart=/path/to/backup_script.sh
  1. 创建定时器文件 /etc/systemd/system/my_backup.timer:
[Unit]
Description=Run backup daily at 2am

[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true

[Install]
WantedBy=timers.target
  1. 启用并启动定时器:
sudo systemctl daemon-reload
sudo systemctl enable my_backup.timer
sudo systemctl start my_backup.timer

3. 定时器时间格式

Systemd 定时器使用 OnCalendar 表达式,比 crontab 更灵活:

# 每天凌晨 2 点
OnCalendar=*-*-* 02:00:00

# 每周一上午 8 点
OnCalendar=Mon *-*-* 08:00:00

# 每月 1 号和 15 号
OnCalendar=*-*-1,15 00:00:00

# 每 5 分钟
OnCalendar=*:0/5

第四部分:进阶技巧

1. 日志管理

Systemd 日志查看:

# 查看服务日志
journalctl -u service_name

# 查看最近日志
journalctl -xe

# 按时间筛选
journalctl --since "2023-01-01" --until "2023-01-02"

Crontab 日志: 默认情况下,cron 任务的输出会通过邮件发送给用户。可以重定向输出到文件:

* * * * * /path/to/command >> /var/log/my_command.log 2>&1

2. 错误处理

Systemd 服务自动重启: 在服务文件中设置:

Restart=on-failure
RestartSec=5s

Crontab 错误通知:

* * * * * /path/to/command || echo "Command failed at $(date)" >> /var/log/command_errors.log

3. 环境变量

Systemd 服务环境变量:

[Service]
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
Environment="MY_VAR=my_value"

Crontab 环境变量: 在 crontab 文件顶部设置:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
MY_VAR=my_value

第五部分:选择指南

何时使用 Systemd 服务/定时器:

  • 需要复杂依赖关系的任务
  • 需要更好的日志记录
  • 需要精确控制任务执行环境
  • 系统级任务

何时使用 Crontab:

  • 简单的用户级定时任务
  • 需要快速设置的任务
  • 传统脚本兼容性要求

总结

本教程涵盖了从基础的 Systemd 和 Crontab 使用到进阶的定时器配置和日志管理。Systemd 提供了更现代、更强大的任务管理方式,而 Crontab 则保持了简单易用的特点。根据您的具体需求选择合适的工具,或者结合使用两者以获得最佳效果。