Systemd 是现代 Linux 系统的主要初始化系统和服务管理器,它取代了传统的 SysVinit 系统。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
/etc/systemd/system/
)sudo nano /etc/systemd/system/my_custom_service.service
[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
sudo systemctl daemon-reload
sudo systemctl start my_custom_service
sudo systemctl enable my_custom_service
Cron 是 Linux 系统中用于定时执行任务的守护进程。用户可以通过 crontab 文件来设置定时任务。
# 编辑当前用户的 crontab
crontab -e
# 列出当前用户的 crontab
crontab -l
# 删除当前用户的 crontab
crontab -r
# 以其他用户身份编辑 crontab
sudo crontab -u username -e
Crontab 时间格式由五个字段组成:
* * * * * command_to_execute
│ │ │ │ │
│ │ │ │ └── 星期几 (0 - 6) (0 表示星期日)
│ │ │ └──── 月份 (1 - 12)
│ │ └────── 日 (1 - 31)
│ └──────── 小时 (0 - 23)
└────────── 分钟 (0 - 59)
# 每天凌晨 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 的替代方案,具有更好的集成性和日志记录功能。
/etc/systemd/system/my_backup.service
:[Unit]
Description=My Backup Service
[Service]
Type=oneshot
ExecStart=/path/to/backup_script.sh
/etc/systemd/system/my_backup.timer
:[Unit]
Description=Run backup daily at 2am
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable my_backup.timer
sudo systemctl start my_backup.timer
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
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
Systemd 服务自动重启: 在服务文件中设置:
Restart=on-failure
RestartSec=5s
Crontab 错误通知:
* * * * * /path/to/command || echo "Command failed at $(date)" >> /var/log/command_errors.log
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 则保持了简单易用的特点。根据您的具体需求选择合适的工具,或者结合使用两者以获得最佳效果。