# -*- coding: utf-8 -*- # @Author: wangkun # @Time: 2023/7/17 import os from crontab import CronTab class Control: @classmethod def crontab_add(cls, rule, command): """ 添加 crontab 任务 :param rule: 运行时间规则,如:* * * * *;00 00 * * * :param command: crontab 任务,如:"python3 control/monitor/monitor_logs.py" :return:None """ # 创建CronTab对象 cron = CronTab(user=True) # 新增一行 job = cron.new(command=command) job.setall(rule) # 保存更改 cron.write() @classmethod def crontab_edit(cls, enable, command): """ 注释 / 取消注释 crontab 任务 :param enable: True:取消注释 crontab 任务;False:注释 crontab 任务 :param command: 需要注释的 crontab 任务,如:"python3 control/monitor/monitor_logs.py" :return: None """ # 创建一个新的crontab对象 cron = CronTab(user=True) # 选择要注释掉的cron任务 # find_command方法返回一个生成器对象,而不是单个任务对象。因此,需要使用next函数来获取生成器的下一个元素,然后对该元素调用enable方法来取消注释cron任务 job = next(cron.find_command(command)) # 取消注释cron任务 job.enable(enable) # 将更改写入crontab cron.write() @classmethod def crontab_remove(cls, command): """ 删除 crontab 任务 :param command: crontab 任务,如:"python3 control/monitor/monitor_logs.py" :return: """ # 创建一个新的crontab对象 cron = CronTab(user=True) # 选择要删除的cron任务 job = cron.find_command(command) # 删除cron任务 cron.remove(job) # 将更改写入crontab cron.write() @classmethod def crawler_stop(cls, command): cmd = f"ps aux | grep {command.split(' ')[-1].split('/')[-1]}" + " | grep -v grep | awk '{print $2}' | xargs kill -9" print(cmd) print("执行杀进程命令") os.system(cmd) # 创建一个新的crontab对象 cron = CronTab(user=True) if command in [job.command for job in cron]: print("command已存在,开始停用\n") cls.crontab_edit(False, command) return else: print("command不存在,无需停用\n") return @classmethod def crawler_start(cls, rule, command): # 创建一个新的crontab对象 cron = CronTab(user=True) if command in [job.command for job in cron]: print("command 已存在,开始启用\n") cls.crontab_edit(True, command) return else: print("command 不存在,新增并启用\n") cls.crontab_add(rule, command) return @classmethod def crawler_restart(cls, rule, command): cmd = f"ps aux | grep {command.split(' ')[-1].split('/')[-1]}" + " | grep -v grep | awk '{print $2}' | xargs kill -9" print(cmd) print("执行杀进程命令") os.system(cmd) print("正在启动 command") cls.crawler_start(rule, command) if __name__ == "__main__": # Control.crontab_add("* * * * *", "python3 control/monitor/monitor_logs.py") # Control.crontab_edit(False, "python3 control/monitor/monitor_logs.py") # Control.crontab_remove("python3 control/monitor/monitor_logs.py") # # Control.crawler_start("* * * * *", "python3 control/monitor/monitor_logs.py") # Control.crawler_stop("python3 control/monitor/monitor_logs.py") Control.crawler_restart("* * * * *", "python3 control/monitor/monitor_logs.py") pass