2025-01-01 19:34:00
围观(2221)
众所周知,在 Linux 系统部署自己编写的代码,无论使用的是什么语言,都可以轻松调用 Crontab 定时任务管理。
使用 Windows 在开发或者部署程序时没法使用 Crontab ,利用元旦假期的半天时间,实现了这个小玩意,直接上代码:
import json
from time import sleep
import time
import redis
from croniter import croniter, CroniterBadCronError
from datetime import datetime
import concurrent.futures
import subprocess
# 读取配置文件
with open('config.json', 'r', encoding='utf-8') as file:
config = json.load(file)
def main():
with concurrent.futures.ThreadPoolExecutor(max_workers=config['max_workers']) as executor:
while 1:
cur_time = int(time.time())
crontabs = get_crontabs()
for crontab in crontabs:
if config['mode'] == 'redis':
crontab = crontab.decode('utf-8')
crontab = json.loads(crontab)
if crontab is None:
continue
if crontab['path'] is None:
# print(f'未设置执行路径:{crontab}')
continue
try:
ci = croniter(crontab['crontab'], cur_time)
pre_time = int(ci.get_prev(datetime).timestamp() + (8 * 3600))
next_time = int(ci.get_next(datetime).timestamp() + (8 * 3600))
if cur_time == pre_time or cur_time == next_time:
command = crontab['command']
path = crontab['path']
executor.submit(execute_command, command, path)
except CroniterBadCronError as e:
print(f'解析 crontab 失败:{crontab['crontab']}, 错误原因:{e}')
continue
sleep(1)
def get_crontabs():
if config['mode'] == 'file':
# 文件驱动
with open('crontab.json', 'r', encoding='utf-8') as crontabFile:
return json.load(crontabFile)
# redis 驱动
r = redis.Redis(host=config['redis_host'], port=config['redis_port'], password=config['redis_password'],
db=config['redis_index'])
return r.hgetall('CRONTABS').values()
def execute_command(command, path):
print(f"进入目录:{path},执行命令:{command}")
res = subprocess.run(command, cwd=path, capture_output=True, text=True)
print(f"命令[{command}]的响应结果:{res.stdout}")
if __name__ == '__main__':
main()复制以上代码保存到 py 文件,装好所需的依赖包,设置配置 (程序根目录的 config.json):
{
"mode":"file",
"redis_host": "127.0.0.1",
"redis_password": null,
"redis_port": 6379,
"redis_index": 0,
"max_workers": 100
}配置文件中的 mode 意味着使用的定时任务管理方式,可选值是 “redis” 和 “file”。设置为 “file” 后,需要在程序根目录下设置 crontab.json 文件:
[
{
"crontab": "* * * * *",
"command": "php 2.php",
"path": "D:\\project\\crontab"
},
{
"crontab": "* * * * *",
"command": "php 1.php",
"path": "D:\\project\\crontab\\t"
},
{
"crontab": "* * * * *",
"command": "php 3.php",
"path": "D:\\project\\crontab"
},
{
"crontab": "3/5 * * * *",
"command": "php 1.php",
"path": "D:\\project\\crontab\\t"
}
]以上内容为实例,需要根据实际需求自行设置。
设置 mode 为 redis 时,需注意填写 redis 相关配置,例如地址、密码、端口等,然后定时任务内容设置在哈希表,表名是 "CRONTABS"
每行数据的键自定义,值内容和上面一致,如:
{"crontab":"* * * * *","command":"php 3.php","path":"D:\\project\\crontab"}
运行效果:

运行模式推荐使用 redis,程序上可随时管理定时任务。
放上打包好的程序及代码: https://pan.baidu.com/s/1Oy-6NrZ5ePPU2R0LTcSx8w?pwd=3h2m
注:配置文件的 max_workers 是设置最大的线程数,需要根据自己电脑性能配置及定时任务数量调整。
本文地址 : bubaijun.com/page.php?id=240
版权声明 : 未经允许禁止转载!
上一篇文章: PHP长文本非对称密钥加解密
下一篇文章: 关闭 RAGFlow 的注册功能