control.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. # -*- coding: utf-8 -*-
  2. # @Author: wangkun
  3. # @Time: 2023/7/17
  4. import os
  5. from crontab import CronTab
  6. class Control:
  7. @classmethod
  8. def crontab_add(cls, rule, command):
  9. """
  10. 添加 crontab 任务
  11. :param rule: 运行时间规则,如:* * * * *;00 00 * * *
  12. :param command: crontab 任务,如:"python3 control/monitor/monitor_logs.py"
  13. :return:None
  14. """
  15. # 创建CronTab对象
  16. cron = CronTab(user=True)
  17. # 新增一行
  18. job = cron.new(command=command)
  19. job.setall(rule)
  20. # 保存更改
  21. cron.write()
  22. @classmethod
  23. def crontab_edit(cls, enable, command):
  24. """
  25. 注释 / 取消注释 crontab 任务
  26. :param enable: True:取消注释 crontab 任务;False:注释 crontab 任务
  27. :param command: 需要注释的 crontab 任务,如:"python3 control/monitor/monitor_logs.py"
  28. :return: None
  29. """
  30. # 创建一个新的crontab对象
  31. cron = CronTab(user=True)
  32. # 选择要注释掉的cron任务
  33. # find_command方法返回一个生成器对象,而不是单个任务对象。因此,需要使用next函数来获取生成器的下一个元素,然后对该元素调用enable方法来取消注释cron任务
  34. job = next(cron.find_command(command))
  35. # 取消注释cron任务
  36. job.enable(enable)
  37. # 将更改写入crontab
  38. cron.write()
  39. @classmethod
  40. def crontab_remove(cls, command):
  41. """
  42. 删除 crontab 任务
  43. :param command: crontab 任务,如:"python3 control/monitor/monitor_logs.py"
  44. :return:
  45. """
  46. # 创建一个新的crontab对象
  47. cron = CronTab(user=True)
  48. # 选择要删除的cron任务
  49. job = cron.find_command(command)
  50. # 删除cron任务
  51. cron.remove(job)
  52. # 将更改写入crontab
  53. cron.write()
  54. @classmethod
  55. def crawler_stop(cls, command):
  56. cmd = f"ps aux | grep {command.split(' ')[-1].split('/')[-1]}" + " | grep -v grep | awk '{print $2}' | xargs kill -9"
  57. print(cmd)
  58. print("执行杀进程命令")
  59. os.system(cmd)
  60. # 创建一个新的crontab对象
  61. cron = CronTab(user=True)
  62. if command in [job.command for job in cron]:
  63. print("command已存在,开始停用\n")
  64. cls.crontab_edit(False, command)
  65. return
  66. else:
  67. print("command不存在,无需停用\n")
  68. return
  69. @classmethod
  70. def crawler_start(cls, rule, command):
  71. # 创建一个新的crontab对象
  72. cron = CronTab(user=True)
  73. if command in [job.command for job in cron]:
  74. print("command 已存在,开始启用\n")
  75. cls.crontab_edit(True, command)
  76. return
  77. else:
  78. print("command 不存在,新增并启用\n")
  79. cls.crontab_add(rule, command)
  80. return
  81. @classmethod
  82. def crawler_restart(cls, rule, command):
  83. cmd = f"ps aux | grep {command.split(' ')[-1].split('/')[-1]}" + " | grep -v grep | awk '{print $2}' | xargs kill -9"
  84. print(cmd)
  85. print("执行杀进程命令")
  86. os.system(cmd)
  87. print("正在启动 command")
  88. cls.crawler_start(rule, command)
  89. if __name__ == "__main__":
  90. # Control.crontab_add("* * * * *", "python3 control/monitor/monitor_logs.py")
  91. # Control.crontab_edit(False, "python3 control/monitor/monitor_logs.py")
  92. # Control.crontab_remove("python3 control/monitor/monitor_logs.py")
  93. #
  94. # Control.crawler_start("* * * * *", "python3 control/monitor/monitor_logs.py")
  95. # Control.crawler_stop("python3 control/monitor/monitor_logs.py")
  96. Control.crawler_restart("* * * * *", "python3 control/monitor/monitor_logs.py")
  97. pass