#!/usr/bin/env bash # ============================================================================= # 物流提取脚本 - systemd 优化版 # ============================================================================= # # 同机多实例(并行查询):每个进程独立 Chrome,进程内仍是串行抓取,不是「单进程多线程并行」。 # Java 侧配置逗号分隔多个地址,例如: # jarvis.server.logistics.base-urls=http://127.0.0.1:5001,http://127.0.0.1:5002,http://127.0.0.1:5003 # # 三端口示例(建议每实例单独 LOG_FILE,避免日志交错): # LOGISTICS_PORT=5001 LOG_FILE="${PWD}/logistics-5001.log" ./run_logistics.sh # LOGISTICS_PORT=5002 LOG_FILE="${PWD}/logistics-5002.log" ./run_logistics.sh # LOGISTICS_PORT=5003 LOG_FILE="${PWD}/logistics-5003.log" ./run_logistics.sh # # systemd:复制三份 service,分别设置 Environment=LOGISTICS_PORT=500x 与不同的日志路径。 # ============================================================================= set -euo pipefail # 配置部分 readonly SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" readonly VENV_DIR="${VENV_DIR:-${SCRIPT_DIR}/venv}" readonly PYTHON_SCRIPT="${PYTHON_SCRIPT:-${SCRIPT_DIR}/jd/fetch_logistics_ubuntu.py}" readonly LOG_FILE="${LOG_FILE:-${SCRIPT_DIR}/logistics.log}" # 供 jd/fetch_logistics_ubuntu.py 读取(默认 5001) export LOGISTICS_PORT="${LOGISTICS_PORT:-5001}" # 日志函数 log_info() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] [INFO] $*" | tee -a "${LOG_FILE}" } log_error() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] [ERROR] $*" | tee -a "${LOG_FILE}" >&2 } # 检查文件是否存在 check_file() { if [[ ! -f "$1" ]]; then log_error "文件不存在: $1" return 1 fi return 0 } # 检查目录是否存在 check_dir() { if [[ ! -d "$1" ]]; then log_error "目录不存在: $1" return 1 fi return 0 } # 主函数 main() { log_info "开始执行物流提取脚本 (LOGISTICS_PORT=${LOGISTICS_PORT})" # 切换到脚本目录 cd "${SCRIPT_DIR}" || { log_error "无法切换到目录: ${SCRIPT_DIR}" return 1 } # 检查虚拟环境 if ! check_dir "${VENV_DIR}"; then return 1 fi # 检查Python脚本 if ! check_file "${PYTHON_SCRIPT}"; then return 1 fi # 激活虚拟环境 log_info "激活虚拟环境: ${VENV_DIR}" source "${VENV_DIR}/bin/activate" || { log_error "无法激活虚拟环境" return 1 } # 检查Python版本 python_version=$(python --version 2>&1) log_info "Python版本: ${python_version}" # 运行Python脚本 log_info "执行脚本: ${PYTHON_SCRIPT}" # 传递所有参数给Python脚本 if python "${PYTHON_SCRIPT}" "$@"; then log_info "脚本执行成功" return 0 else log_error "脚本执行失败" return 1 fi } # 执行 if main "$@"; then exit 0 else exit 1 fi