#!/bin/bash # 加密货币分析智能体定时任务启动脚本 # 该脚本用于在后台启动智能体定时任务 # 使用说明: # ./schedule_task.sh start crypto 360 # 以360分钟为间隔启动加密货币智能体 # ./schedule_task.sh start gold "08:30" # 每天08:30运行黄金智能体 # ./schedule_task.sh start both 240 # 以240分钟为间隔同时启动两种智能体 # ./schedule_task.sh stop # 停止所有运行中的定时任务 # ./schedule_task.sh status # 查看运行状态 # 获取当前脚本所在目录 SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) LOG_DIR="${SCRIPT_DIR}/logs" SCHEDULE_LOG="${LOG_DIR}/schedule_task.log" # 确保日志目录存在 mkdir -p "${LOG_DIR}" # 激活虚拟环境(如果使用了虚拟环境) VENV_PATH="${SCRIPT_DIR}/venv" if [ -d "${VENV_PATH}" ]; then source "${VENV_PATH}/bin/activate" echo "已激活虚拟环境: ${VENV_PATH}" fi # 定义启动定时任务的函数 start_schedule_task() { local agent_type=$1 local time_or_interval=$2 local cmd="python ${SCRIPT_DIR}/schedule_task.py" # 如果同时执行两种智能体 if [ "${agent_type}" == "both" ]; then cmd="${cmd} --both" else cmd="${cmd} --agent ${agent_type}" fi # 判断第二个参数是时间点还是间隔 if [[ "${time_or_interval}" =~ ^[0-9]+$ ]]; then # 如果是纯数字,则认为是间隔 cmd="${cmd} --interval ${time_or_interval}" else # 否则认为是时间点 cmd="${cmd} --time \"${time_or_interval}\"" fi # 使用nohup在后台运行 echo "启动定时任务: ${cmd}" nohup ${cmd} > "${SCHEDULE_LOG}" 2>&1 & # 保存PID echo $! > "${SCRIPT_DIR}/.schedule_task.pid" echo "定时任务已在后台启动,PID: $!" echo "日志文件: ${SCHEDULE_LOG}" } # 定义停止定时任务的函数 stop_schedule_task() { if [ -f "${SCRIPT_DIR}/.schedule_task.pid" ]; then local pid=$(cat "${SCRIPT_DIR}/.schedule_task.pid") echo "正在停止定时任务 (PID: ${pid})..." kill -15 ${pid} 2>/dev/null || echo "进程 ${pid} 不存在" rm -f "${SCRIPT_DIR}/.schedule_task.pid" else echo "没有找到运行中的定时任务" fi } # 定义查看状态的函数 check_status() { if [ -f "${SCRIPT_DIR}/.schedule_task.pid" ]; then local pid=$(cat "${SCRIPT_DIR}/.schedule_task.pid") if ps -p ${pid} > /dev/null; then echo "定时任务正在运行 (PID: ${pid})" echo "最近的日志:" tail -n 20 "${SCHEDULE_LOG}" else echo "定时任务已停止 (上次PID: ${pid})" rm -f "${SCRIPT_DIR}/.schedule_task.pid" fi else echo "没有找到运行中的定时任务" fi } # 主逻辑 case "$1" in start) if [ -f "${SCRIPT_DIR}/.schedule_task.pid" ]; then pid=$(cat "${SCRIPT_DIR}/.schedule_task.pid") if ps -p ${pid} > /dev/null; then echo "定时任务已在运行中 (PID: ${pid})" echo "如需重启,请先执行: $0 stop" exit 1 else rm -f "${SCRIPT_DIR}/.schedule_task.pid" fi fi # 检查必要的参数 if [ -z "$2" ]; then echo "缺少参数: agent_type (crypto, gold 或 both)" echo "用法: $0 start [agent_type] [time_or_interval]" exit 1 fi if [ -z "$3" ]; then # 使用默认间隔 start_schedule_task "$2" "360" else start_schedule_task "$2" "$3" fi ;; stop) stop_schedule_task ;; status) check_status ;; *) echo "用法: $0 {start|stop|status}" echo " start [agent_type] [time_or_interval] - 启动定时任务" echo " agent_type: crypto, gold 或 both" echo " time_or_interval: 时间点(HH:MM)或间隔(分钟)" echo " stop - 停止定时任务" echo " status - 查看运行状态" exit 1 ;; esac exit 0