Skip to content

定时重启

在 Linux 中使用 cronsystemd设置每天凌晨 5 点重启的任务都非常方便。cron方法更为简单直接,是大多数情况下的首选。


方法一:使用 Crontab(推荐,最常用)

这是最经典、最快捷的方法。

  1. 编辑 root 用户的 crontab

    重启需要 root 权限,因此必须使用 sudo编辑 root 的任务计划。

    sudo crontab -e

    如果是第一次操作,可能会让你选择编辑器(推荐选择 vim,比较简单)。

  2. 添加定时任务

    在文件末尾添加以下一行:

    0 5 * * * /sbin/reboot
    • **0 5 * * ***​ 是时间设置,含义为:分钟(0) 小时(5) 日() 月() 星期(*),即每天凌晨 5 点整。

    • **/sbin/reboot**​ 是要执行的命令(系统重启命令的绝对路径)。

  3. 保存并退出

    • 如果使用 vim:按 Ctrl + X,然后按 Y确认,最后按 Enter保存。

    • 如果使用 vim:按 Esc,然后输入 :wq,再按 Enter

  4. 验证任务是否添加成功

    sudo crontab -l

    你应该能看到刚才添加的那一行 0 5 * * * /sbin/reboot

**完成!**​ 系统此后会在每天凌晨 5 点自动重启。


方法二:使用 Systemd Timers(现代方法)

systemd是新一代的初始化系统,它通过「定时器」(Timer)来实现类似 cron的功能。步骤稍多,但更结构化。

  1. 创建 Service 文件

    首先创建一个定义「要执行什么任务」的 service 文件。

    sudo vim /etc/systemd/system/daily-reboot.service

    写入以下内容:

    [Unit]
    Description=Daily Reboot
    
    [Service]
    Type=oneshot
    ExecStart=/usr/sbin/reboot
    • Type=oneshot表示这是一个一次性任务,执行完就结束。
  2. 创建 Timer 文件

    接着创建一个同名的 timer 文件来定义「何时执行」。

    sudo vim /etc/systemd/system/daily-reboot.timer

    写入以下内容:

    [Unit]
    Description=Triggers a daily reboot at 5:00 AM
    
    [Timer]
    OnCalendar=*-*-* 05:00:00
    Persistent=true
    
    [Install]
    WantedBy=timers.target
    • **OnCalendar=*-*-* 05:00:00**​ 是核心配置,意思是 年-月-日 05:00:00,即每天凌晨 5 点。

    • **Persistent=true**​ 表示如果上次触发时系统关机了(比如刚好在凌晨5点关机了),下次启动时会立即补执行。

  3. 启用并启动 Timer

    # 重新加载 systemd 配置,使其识别新文件
    sudo systemctl daemon-reload
    
    # 启用定时器(使其在系统启动时自动激活)
    sudo systemctl enable daily-reboot.timer
    
    # 启动定时器
    sudo systemctl start daily-reboot.timer
  4. 验证 Timer 状态

    # 查看定时器状态
    sudo systemctl status daily-reboot.timer
    
    # 查看所有已启用的定时器列表,确认它在下一次触发时间
    sudo systemctl list-timers

方法对比与建议

特性 Crontab Systemd Timer
简单性 极简,一行命令即可 需要创建两个文件,步骤繁琐
日志 日志在 /var/log/syslogjournalctl中查看 使用 journalctl -u daily-reboot.service查看,更清晰
灵活性 时间语法非常成熟灵活 时间语法同样强大,支持单调定时器(相对于启动时间)
依赖管理 ,可以定义与其他服务的依赖关系
适用场景 绝大多数日常自动化任务 更适合与系统服务深度集成的复杂任务

定时推送企业微信消息

1. 创建发送 Webhook 的 Python 脚本

sudo vim /usr/local/bin/send_meeting_reminder.py

脚本内容如下:

python
#!/usr/bin/env python3
import requests
import json
import sys
import os
from datetime import datetime

def send_webhook():
    # 请替换为您的企业微信机器人 Webhook URL
    webhook_url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_WEBHOOK_KEY"
    
    # 按照要求格式化的消息内容
    message = {
        "msgtype": "markdown",
        "markdown": {
            "content": "**📅 每日早会提醒**\n\n各位同事,请及时更新今日的早会跟踪表格:\n- 📊 [点击填写早会跟踪表](链接) \n- ⏰ 请在09:45前完成更新"
        }
    }
    
    try:
        # 发送 POST 请求
        headers = {'Content-Type': 'application/json'}
        response = requests.post(
            webhook_url, 
            data=json.dumps(message, ensure_ascii=False).encode('utf-8'),
            headers=headers,
            timeout=30
        )
        
        # 记录日志
        log_message = f"{datetime.now()}: 早会提醒发送{'成功' if response.status_code == 200 else '失败'} - 状态码: {response.status_code}"
        print(log_message)
        
        # 写入系统日志
        with open('/var/log/meeting-reminder.log', 'a') as f:
            f.write(log_message + '\n')
            
        return response.status_code == 200
        
    except Exception as e:
        error_msg = f"{datetime.now()}: 发送Webhook时出错: {str(e)}"
        print(error_msg)
        with open('/var/log/meeting-reminder.log', 'a') as f:
            f.write(error_msg + '\n')
        return False

if __name__ == "__main__":
    send_webhook()

给脚本执行权限:

sudo chmod +x /usr/local/bin/send_meeting_reminder.py

安装 Python 依赖:

sudo apt update
sudo apt install python3-pip -y
sudo pip3 install requests

2. 创建 Systemd Service 文件

sudo vim /etc/systemd/system/meeting-reminder.service

内容如下:

[Unit]
Description=发送每日早会提醒到企业微信群
Wants=meeting-reminder.timer
After=network.target

[Service]
Type=oneshot
User=root
ExecStart=/usr/bin/python3 /home/ubuntu/meeting-reminder/send_meeting_reminder.py
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

3. 创建 Systemd Timer 文件(关键修改)

由于需要在工作日早上9:30发送,但提醒内容要求在09:45前完成,这个时间设置是合理的。

sudo vim /etc/systemd/system/meeting-reminder.timer

内容如下:

[Unit]
Description=工作日早上9:30发送早会提醒
Requires=meeting-reminder.service

[Timer]
# 每周一至周五早上9:30执行
OnCalendar=Mon..Fri 09:30:00
Persistent=false

[Install]
WantedBy=timers.target

4. 启用并启动服务

# 重新加载 systemd 配置
sudo systemctl daemon-reload

# 启用并启动定时器
sudo systemctl enable meeting-reminder.timer
sudo systemctl start meeting-reminder.timer

# 启用服务
sudo systemctl enable meeting-reminder.service

5. 重要配置说明

替换实际参数

在运行前,请修改脚本中的两个关键参数:

  1. Webhook URL:将 YOUR_WEBHOOK_KEY替换为您的企业微信机器人实际 Webhook 地址

  2. 跟踪表链接:将 链接替换为实际的早会跟踪表格 URL

验证配置

# 查看定时器状态
sudo systemctl status meeting-reminder.timer

# 查看下一次执行时间
sudo systemctl list-timers | grep meeting-reminder

# 手动测试一次(确保配置正确后)
sudo systemctl start meeting-reminder.service

# 查看执行日志
sudo journalctl -u meeting-reminder.service -n 10

6. 企业微信消息格式说明

根据企业微信机器人文档,我们使用的 markdown 格式完全符合要求:

  • 支持加粗、链接、列表等格式

  • 消息内容清晰明了,包含具体的时间要求和操作指引

如果需要调整消息格式,可以修改 Python 脚本中的 message内容部分。


故障排除提示

如果消息发送失败,请检查:

  1. Webhook URL 是否正确

  2. 服务器网络是否能访问企业微信 API

  3. 企业微信机器人是否已正确配置并启用

  4. 查看详细日志:sudo journalctl -u meeting-reminder.service -f

这样配置后,系统会在每个工作日的早上9:30准时发送格式化的早会提醒到企业微信群。

取消定时器

要取消定时器和服务,请按照以下步骤操作:


1. 停止并禁用定时器和服务

# 停止定时器
sudo systemctl stop meeting-reminder.timer

# 禁用定时器(防止开机自启)
sudo systemctl disable meeting-reminder.timer

# 停止服务
sudo systemctl stop meeting-reminder.service

# 禁用服务
sudo systemctl disable meeting-reminder.service

2. 检查状态确认已停止

# 检查定时器状态(应该显示 inactive)
sudo systemctl status meeting-reminder.timer

# 检查服务状态(应该显示 inactive)
sudo systemctl status meeting-reminder.service

# 查看所有活动的定时器,确认 meeting-reminder 不在列表中
sudo systemctl list-timers

3. 重新加载 systemd 配置

# 重新加载 systemd 配置
sudo systemctl daemon-reload

# 重置所有失败的单元状态
sudo systemctl reset-failed

4. 可选:删除相关文件

如果您确定不再需要这个定时任务,可以删除创建的文件:

# 删除服务文件
sudo rm /etc/systemd/system/meeting-reminder.service

# 删除定时器文件
sudo rm /etc/systemd/system/meeting-reminder.timer

# 删除Python脚本(可选)
sudo rm /usr/local/bin/send_meeting_reminder.py

# 删除日志文件(可选)
sudo rm /var/log/meeting-reminder.log

# 重新加载 systemd 配置
sudo systemctl daemon-reload

5. 验证清理完成

# 检查是否还有相关文件存在
sudo systemctl list-unit-files | grep meeting-reminder

# 检查定时器列表确认已移除
sudo systemctl list-timers

6. 如果需要重新启用

如果您将来需要重新启用这个定时任务:

# 重新创建文件后执行
sudo systemctl daemon-reload
sudo systemctl enable meeting-reminder.timer
sudo systemctl start meeting-reminder.timer
sudo systemctl enable meeting-reminder.service

一键清理命令

如果您想要快速清理所有相关内容,可以运行以下命令:

# 停止和禁用服务
sudo systemctl stop meeting-reminder.timer meeting-reminder.service
sudo systemctl disable meeting-reminder.timer meeting-reminder.service

# 删除文件
sudo rm -f /etc/systemd/system/meeting-reminder.service \
           /etc/systemd/system/meeting-reminder.timer \
           /usr/local/bin/send_meeting_reminder.py

# 重新加载配置
sudo systemctl daemon-reload
sudo systemctl reset-failed

# 验证清理
echo "检查定时器状态:"
sudo systemctl status meeting-reminder.timer 2>/dev/null || echo "定时器已删除"
echo "检查服务状态:"
sudo systemctl status meeting-reminder.service 2>/dev/null || echo "服务已删除"

重要提醒

  1. 备份需求:如果您可能需要重新使用这个定时任务,建议先备份相关文件而不是直接删除

  2. 日志保留:日志文件 /var/log/meeting-reminder.log包含历史记录,可根据需要决定是否保留

  3. Python依赖:安装的 requests库可以保留,可能对其他脚本有用

完成上述步骤后,定时器和相关服务就完全从您的系统中移除了。

基于 VitePress 构建