import os
import sys
import time
from datetime import datetime
def restart_script():
"""重启当前脚本"""
print(f"[{datetime.now():%Y-%m-%d %H:%M:%S}] 执行:重启脚本")
python = sys.executable
os.execv(python, [python] + sys.argv)
if __name__ == "__main__":
# 你的代码逻辑
print(f"[{datetime.now():%Y-%m-%d %H:%M:%S}] 执行:开始运行。。。")
time.sleep(2) # 执行业务逻辑,满是某些条件后,触发下面的重启
# 某个条件下重启
restart_script()
import time
from croniter import croniter
from datetime import datetime
from typing import Callable
class CronTask:
"""Crontab 定时任务类,支持标准 5 位 Crontab 表达式"""
def __init__(self, cron_expr: str, func: Callable, *args, **kwargs):
self.cron_expr = cron_expr # Crontab 表达式
self.func = func # 要执行的任务函数
self.args = args # 函数参数
self.kwargs = kwargs # 函数关键字参数
# 初始化 croniter,基于当前时间计算下次执行时间
self.cron = croniter(cron_expr, datetime.now())
self.next_run = self.cron.get_next(datetime) # 下次执行时间
def check_and_run(self):
"""检查是否到达执行时间,到达则运行任务"""
now = datetime.now()
# 时间匹配(精确到秒)
if now >= self.next_run:
try:
# 执行任务
self.func(*self.args, **self.kwargs)
except Exception as e:
print(f"任务执行失败:{str(e)}")
# 更新下次执行时间
self.next_run = self.cron.get_next(datetime)
print(f"下次执行时间:{self.next_run}")
# 初始化任务管理器
class CronScheduler:
def __init__(self, check_interval: int = 1):
self.tasks = []
self.check_interval = check_interval # 轮询检查间隔(秒)
def add_task(self, cron_expr: str, func: Callable, *args, **kwargs):
"""添加 Crontab 任务"""
if not croniter.is_valid(cron_expr):
raise ValueError(f"无效的 Crontab 表达式:{cron_expr}")
task = CronTask(cron_expr, func, *args, **kwargs)
self.tasks.append(task)
print(f"已添加任务 | Crontab:{cron_expr} | 下次执行:{task.next_run}")
def start(self):
"""启动定时任务调度器"""
print("Crontab 调度器已启动,按 Ctrl+C 停止")
while True:
# 遍历所有任务,检查是否需要执行
for task in self.tasks:
task.check_and_run()
# 轮询等待
time.sleep(self.check_interval)
# ====================== 测试任务示例 ======================
def task1():
"""测试任务1:每秒执行"""
with open('/home/task1.txt', 'a') as fp:
fp.write(f"[{datetime.now()}] 执行任务1:每分打印一次")
fp.write('\n')
print(f"[{datetime.now()}] 执行任务1:zzzz")
def task2(name: str):
with open('/home/task2.txt', 'a') as fp:
fp.write(f"[{datetime.now()}] 执行任务2:每分打印一次")
fp.write('\n')
"""测试任务2:带参数,每分钟执行"""
print(f"[{datetime.now()}] 执行任务2:Hello {name}")
def task3():
"""测试任务3:每天 9:30 执行"""
print(f"[{datetime.now()}] 执行任务3:每日 9:30 定时任务")
# ====================== 启动调度器 ======================
if __name__ == "__main__":
# 创建调度器实例
scheduler = CronScheduler()
# 添加任务(标准 5 位 Crontab 格式:分 时 日 月 周)
scheduler.add_task("* * * * *", task1) # 每秒执行(* 代表每秒/每分钟)
scheduler.add_task("*/1 * * * *", task2, "Python") # 每分钟执行
scheduler.add_task("30 9 * * *", task3) # 每天 9:30 执行
# 启动调度
scheduler.start()