137 lines
4.2 KiB
Bash
Executable File
137 lines
4.2 KiB
Bash
Executable File
#!/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 |