定时重启
在 Linux 中使用 cron或 systemd设置每天凌晨 5 点重启的任务都非常方便。cron方法更为简单直接,是大多数情况下的首选。
方法一:使用 Crontab(推荐,最常用)
这是最经典、最快捷的方法。
编辑 root 用户的 crontab
重启需要 root 权限,因此必须使用
sudo编辑 root 的任务计划。sudo crontab -e如果是第一次操作,可能会让你选择编辑器(推荐选择
vim,比较简单)。添加定时任务
在文件末尾添加以下一行:
0 5 * * * /sbin/reboot**
0 5 * * *** 是时间设置,含义为:分钟(0) 小时(5) 日() 月() 星期(*),即每天凌晨 5 点整。**
/sbin/reboot** 是要执行的命令(系统重启命令的绝对路径)。
保存并退出
如果使用
vim:按Ctrl + X,然后按Y确认,最后按Enter保存。如果使用
vim:按Esc,然后输入:wq,再按Enter。
验证任务是否添加成功
sudo crontab -l你应该能看到刚才添加的那一行
0 5 * * * /sbin/reboot。
**完成!** 系统此后会在每天凌晨 5 点自动重启。
方法二:使用 Systemd Timers(现代方法)
systemd是新一代的初始化系统,它通过「定时器」(Timer)来实现类似 cron的功能。步骤稍多,但更结构化。
创建 Service 文件
首先创建一个定义「要执行什么任务」的 service 文件。
sudo vim /etc/systemd/system/daily-reboot.service写入以下内容:
[Unit] Description=Daily Reboot [Service] Type=oneshot ExecStart=/usr/sbin/rebootType=oneshot表示这是一个一次性任务,执行完就结束。
创建 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点关机了),下次启动时会立即补执行。
启用并启动 Timer
# 重新加载 systemd 配置,使其识别新文件 sudo systemctl daemon-reload # 启用定时器(使其在系统启动时自动激活) sudo systemctl enable daily-reboot.timer # 启动定时器 sudo systemctl start daily-reboot.timer验证 Timer 状态
# 查看定时器状态 sudo systemctl status daily-reboot.timer # 查看所有已启用的定时器列表,确认它在下一次触发时间 sudo systemctl list-timers
方法对比与建议
| 特性 | Crontab | Systemd Timer |
|---|---|---|
| 简单性 | 极简,一行命令即可 | 需要创建两个文件,步骤繁琐 |
| 日志 | 日志在 /var/log/syslog或 journalctl中查看 | 使用 journalctl -u daily-reboot.service查看,更清晰 |
| 灵活性 | 时间语法非常成熟灵活 | 时间语法同样强大,支持单调定时器(相对于启动时间) |
| 依赖管理 | 弱 | 强,可以定义与其他服务的依赖关系 |
| 适用场景 | 绝大多数日常自动化任务 | 更适合与系统服务深度集成的复杂任务 |
定时推送企业微信消息
1. 创建发送 Webhook 的 Python 脚本
sudo vim /usr/local/bin/send_meeting_reminder.py 脚本内容如下:
#!/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. 重要配置说明
替换实际参数
在运行前,请修改脚本中的两个关键参数:
Webhook URL:将
YOUR_WEBHOOK_KEY替换为您的企业微信机器人实际 Webhook 地址跟踪表链接:将
链接替换为实际的早会跟踪表格 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内容部分。
故障排除提示
如果消息发送失败,请检查:
Webhook URL 是否正确
服务器网络是否能访问企业微信 API
企业微信机器人是否已正确配置并启用
查看详细日志:
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 "服务已删除" 重要提醒
备份需求:如果您可能需要重新使用这个定时任务,建议先备份相关文件而不是直接删除
日志保留:日志文件
/var/log/meeting-reminder.log包含历史记录,可根据需要决定是否保留Python依赖:安装的
requests库可以保留,可能对其他脚本有用
完成上述步骤后,定时器和相关服务就完全从您的系统中移除了。