重启自己,crontab

 

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()

 

posted on 2026-05-08 11:09  我和你并没有不同  阅读(11)  评论(0)    收藏  举报