diff --git a/cron/cmd.md b/cron/cmd.md new file mode 100644 index 0000000..2cc2e48 --- /dev/null +++ b/cron/cmd.md @@ -0,0 +1,6 @@ +# 拉取 研报 +```Bash +cd /root/projects/stock/ +export DB_ENV=nas && python3 -m src.em_reports.fetch --begin=2025-12-06 --end=2025-12-15 --mode=fetch +export DB_ENV=nas && python3 -m src.em_reports.fetch --begin=2025-12-06 --end=2025-12-15 --mode=down +``` \ No newline at end of file diff --git a/cron/em_reports.sh b/cron/em_reports.sh new file mode 100644 index 0000000..6f4a03e --- /dev/null +++ b/cron/em_reports.sh @@ -0,0 +1,112 @@ +#!/bin/bash +set -euo pipefail # 严格模式:错误立即退出,未定义变量报错,管道失败触发退出 + +# -------------------------- 颜色常量(美化输出) -------------------------- +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # 重置颜色 + +# -------------------------- 核心配置(可按需修改) -------------------------- +# 工作目录(执行Python脚本的目录) +WORK_DIR="/root/projects/stock/" +# 日期配置文件路径(读取默认begin日期) +DATE_FILE="./cron/reports_curr.txt" +# DB环境变量值 +DB_ENV="nas" +# Python脚本模块路径 +PY_MODULE="src.em_reports.fetch" + +# -------------------------- 日期处理工具函数 -------------------------- +# 验证日期格式是否为 YYYY-MM-DD +validate_date() { + local date_str="$1" + # 使用date命令验证,无效则返回非0 + if date -d "$date_str" "+%Y-%m-%d" >/dev/null 2>&1; then + return 0 + else + return 1 + fi +} + +# 计算日期差值(如 end_date - N天),输出 YYYY-MM-DD 格式 +calc_date_diff() { + local base_date="$1" + local days="$2" + date -d "$base_date - $days days" "+%Y-%m-%d" +} + +# -------------------------- 主逻辑:确定begin/end日期 -------------------------- +# Step 1: 设置end日期(固定为当前日期) +END_DATE=$(date "+%Y-%m-%d") +echo -e "${BLUE}📅 自动获取end日期:$END_DATE${NC}" + +# Step 2: 处理begin日期(优先级:命令行参数 > u3c3.txt > end-7天) +BEGIN_DATE="" +# 检查是否传入命令行参数(第一个参数) +if [[ $# -ge 1 && -n "$1" ]]; then + if validate_date "$1"; then + BEGIN_DATE="$1" + echo -e "${GREEN}✅ 从命令行获取begin日期:$BEGIN_DATE${NC}" + else + echo -e "${RED}❌ 命令行传入的日期 '$1' 格式无效(需为YYYY-MM-DD),尝试读取配置文件...${NC}" + fi +fi + +# Step 3: 若命令行参数无效/未传入,读取u3c3.txt +if [[ -z "$BEGIN_DATE" ]]; then + if [[ -f "$DATE_FILE" ]]; then + # 读取文件内容(去除空白字符/换行) + FILE_DATE=$(cat "$DATE_FILE" | tr -d ' \n\r\t') + if validate_date "$FILE_DATE"; then + BEGIN_DATE="$FILE_DATE" + echo -e "${GREEN}✅ 从$DATE_FILE读取begin日期:$BEGIN_DATE${NC}" + else + echo -e "${YELLOW}⚠️ $DATE_FILE中的日期 '$FILE_DATE' 格式无效,使用默认值...${NC}" + fi + else + echo -e "${YELLOW}⚠️ 未找到$DATE_FILE文件,使用默认值...${NC}" + fi +fi + +# Step 4: 若以上都无,使用end-7天作为默认值 +if [[ -z "$BEGIN_DATE" ]]; then + BEGIN_DATE=$(calc_date_diff "$END_DATE" 7) + echo -e "${GREEN}✅ 使用默认begin日期(end-7天):$BEGIN_DATE${NC}" +fi + +# -------------------------- 执行Python脚本 -------------------------- +echo -e "\n${BLUE}🚀 开始执行em_reports脚本...${NC}" +echo -e "🔍 执行参数:begin=$BEGIN_DATE, end=$END_DATE${NC}" +echo -e "=====================================${NC}" + +# 进入工作目录 +cd "$WORK_DIR" || { + echo -e "${RED}❌ 进入工作目录失败:$WORK_DIR${NC}" + exit 1 +} + +# 执行第一个命令:mode=fetch +echo -e "\n${BLUE}👉 执行模式:fetch${NC}" +export DB_ENV="$DB_ENV" && python3 -m "$PY_MODULE" --begin="$BEGIN_DATE" --end="$END_DATE" --mode=fetch +if [[ $? -ne 0 ]]; then + echo -e "${RED}❌ mode=fetch 执行失败!终止脚本${NC}" + exit 1 +fi +echo -e "${GREEN}✅ mode=fetch 执行成功${NC}" + +# 执行第二个命令:mode=down +echo -e "\n${BLUE}👉 执行模式:down${NC}" +export DB_ENV="$DB_ENV" && python3 -m "$PY_MODULE" --begin="$BEGIN_DATE" --end="$END_DATE" --mode=down +if [[ $? -ne 0 ]]; then + echo -e "${RED}❌ mode=down 执行失败!${NC}" + exit 1 +fi +echo -e "${GREEN}✅ mode=down 执行成功${NC}" + +# -------------------------- 执行完成处理 -------------------------- +echo -e "\n${GREEN}🎉 所有脚本执行完成!${NC}" +# 可选:将本次begin日期写入u3c3.txt,供下次复用 +echo "$BEGIN_DATE" > "$DATE_FILE" +echo -e "${GREEN}✅ 已将begin日期 $BEGIN_DATE 写入$DATE_FILE${NC}" \ No newline at end of file