run_parse_neo4j.sh 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. #!/bin/bash
  2. # =============================================================================
  3. # Neo4j同步程序运行脚本
  4. # 适用于Linux生产环境
  5. # =============================================================================
  6. # 脚本配置
  7. SCRIPT_NAME="run_parse_neo4j.sh"
  8. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  9. PROJECT_ROOT="$SCRIPT_DIR"
  10. PYTHON_SCRIPT="$PROJECT_ROOT/app/core/data_parse/parse_neo4j_process.py"
  11. LOG_DIR="$PROJECT_ROOT/logs"
  12. LOG_FILE="$LOG_DIR/parse_neo4j_$(date +%Y%m%d_%H%M%S).log"
  13. PID_FILE="$PROJECT_ROOT/parse_neo4j.pid"
  14. LOCK_FILE="$PROJECT_ROOT/parse_neo4j.lock"
  15. # 环境变量
  16. export PYTHONPATH="$PROJECT_ROOT:$PYTHONPATH"
  17. export PYTHONUNBUFFERED=1
  18. # 颜色定义
  19. RED='\033[0;31m'
  20. GREEN='\033[0;32m'
  21. YELLOW='\033[1;33m'
  22. BLUE='\033[0;34m'
  23. NC='\033[0m' # No Color
  24. # 日志函数
  25. log_info() {
  26. echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] [INFO]${NC} $1" | tee -a "$LOG_FILE"
  27. }
  28. log_warn() {
  29. echo -e "${YELLOW}[$(date '+%Y-%m-%d %H:%M:%S')] [WARN]${NC} $1" | tee -a "$LOG_FILE"
  30. }
  31. log_error() {
  32. echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] [ERROR]${NC} $1" | tee -a "$LOG_FILE"
  33. }
  34. log_debug() {
  35. echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')] [DEBUG]${NC} $1" | tee -a "$LOG_FILE"
  36. }
  37. # 清理函数
  38. cleanup() {
  39. log_info "执行清理操作..."
  40. # 删除PID文件
  41. if [ -f "$PID_FILE" ]; then
  42. rm -f "$PID_FILE"
  43. log_info "已删除PID文件: $PID_FILE"
  44. fi
  45. # 删除锁文件
  46. if [ -f "$LOCK_FILE" ]; then
  47. rm -f "$LOCK_FILE"
  48. log_info "已删除锁文件: $LOCK_FILE"
  49. fi
  50. log_info "清理操作完成"
  51. }
  52. # 信号处理
  53. trap cleanup EXIT
  54. trap 'log_error "收到中断信号,正在退出..."; exit 1' INT TERM
  55. # 检查依赖
  56. check_dependencies() {
  57. log_info "检查系统依赖..."
  58. # 检查Python
  59. if ! command -v python3 &> /dev/null; then
  60. log_error "Python3 未安装或不在PATH中"
  61. return 1
  62. fi
  63. PYTHON_VERSION=$(python3 --version 2>&1)
  64. log_info "Python版本: $PYTHON_VERSION"
  65. # 检查pip
  66. if ! command -v pip3 &> /dev/null; then
  67. log_error "pip3 未安装或不在PATH中"
  68. return 1
  69. fi
  70. # 检查虚拟环境(如果存在)
  71. if [ -d "$PROJECT_ROOT/venv" ]; then
  72. log_info "检测到虚拟环境: $PROJECT_ROOT/venv"
  73. source "$PROJECT_ROOT/venv/bin/activate"
  74. log_info "已激活虚拟环境"
  75. fi
  76. return 0
  77. }
  78. # 检查Python包依赖
  79. check_python_packages() {
  80. log_info "检查Python包依赖..."
  81. local required_packages=(
  82. "psycopg2-binary"
  83. "neo4j"
  84. "openai"
  85. "boto3"
  86. "Pillow"
  87. "pytesseract"
  88. "requests"
  89. )
  90. for package in "${required_packages[@]}"; do
  91. if ! python3 -c "import ${package//-/_}" 2>/dev/null; then
  92. log_warn "Python包未安装: $package"
  93. if [ "$1" = "--install" ]; then
  94. log_info "尝试安装包: $package"
  95. pip3 install "$package" || log_error "安装包失败: $package"
  96. fi
  97. else
  98. log_debug "Python包已安装: $package"
  99. fi
  100. done
  101. }
  102. # 创建日志目录
  103. create_log_dir() {
  104. if [ ! -d "$LOG_DIR" ]; then
  105. mkdir -p "$LOG_DIR"
  106. log_info "创建日志目录: $LOG_DIR"
  107. fi
  108. }
  109. # 检查是否已在运行
  110. check_running() {
  111. if [ -f "$PID_FILE" ]; then
  112. local pid=$(cat "$PID_FILE")
  113. if ps -p "$pid" > /dev/null 2>&1; then
  114. log_error "程序已在运行,PID: $pid"
  115. return 1
  116. else
  117. log_warn "发现过期的PID文件,正在清理..."
  118. rm -f "$PID_FILE"
  119. fi
  120. fi
  121. if [ -f "$LOCK_FILE" ]; then
  122. log_error "发现锁文件,可能程序正在运行或上次异常退出"
  123. return 1
  124. fi
  125. return 0
  126. }
  127. # 创建锁文件
  128. create_lock() {
  129. echo "$$" > "$LOCK_FILE"
  130. echo "$$" > "$PID_FILE"
  131. log_info "创建锁文件和PID文件"
  132. }
  133. # 检查数据库连接
  134. check_database_connection() {
  135. log_info "检查数据库连接..."
  136. # 这里可以添加数据库连接检查逻辑
  137. # 例如:检查PostgreSQL和Neo4j是否可访问
  138. log_info "数据库连接检查完成"
  139. }
  140. # 运行主程序
  141. run_main_program() {
  142. log_info "开始运行Neo4j同步程序..."
  143. log_info "工作目录: $PROJECT_ROOT"
  144. log_info "Python脚本: $PYTHON_SCRIPT"
  145. log_info "日志文件: $LOG_FILE"
  146. # 运行Python脚本
  147. cd "$PROJECT_ROOT"
  148. python3 "$PYTHON_SCRIPT" 2>&1 | tee -a "$LOG_FILE"
  149. local exit_code=$?
  150. if [ $exit_code -eq 0 ]; then
  151. log_info "程序执行成功"
  152. else
  153. log_error "程序执行失败,退出码: $exit_code"
  154. fi
  155. return $exit_code
  156. }
  157. # 显示帮助信息
  158. show_help() {
  159. echo "用法: $0 [选项]"
  160. echo ""
  161. echo "选项:"
  162. echo " -h, --help 显示此帮助信息"
  163. echo " -v, --version 显示版本信息"
  164. echo " -i, --install 自动安装缺失的Python包"
  165. echo " -c, --check 只检查依赖,不运行程序"
  166. echo " -f, --force 强制运行(忽略锁文件检查)"
  167. echo " -l, --log-dir DIR 指定日志目录"
  168. echo ""
  169. echo "示例:"
  170. echo " $0 正常运行程序"
  171. echo " $0 --install 安装依赖后运行程序"
  172. echo " $0 --check 只检查依赖"
  173. echo " $0 --force 强制运行程序"
  174. }
  175. # 显示版本信息
  176. show_version() {
  177. echo "Neo4j同步程序运行脚本 v1.0.0"
  178. echo "适用于Linux生产环境"
  179. }
  180. # 主函数
  181. main() {
  182. local force_run=false
  183. local check_only=false
  184. local install_packages=false
  185. # 解析命令行参数
  186. while [[ $# -gt 0 ]]; do
  187. case $1 in
  188. -h|--help)
  189. show_help
  190. exit 0
  191. ;;
  192. -v|--version)
  193. show_version
  194. exit 0
  195. ;;
  196. -i|--install)
  197. install_packages=true
  198. shift
  199. ;;
  200. -c|--check)
  201. check_only=true
  202. shift
  203. ;;
  204. -f|--force)
  205. force_run=true
  206. shift
  207. ;;
  208. -l|--log-dir)
  209. LOG_DIR="$2"
  210. shift 2
  211. ;;
  212. *)
  213. log_error "未知参数: $1"
  214. show_help
  215. exit 1
  216. ;;
  217. esac
  218. done
  219. # 创建日志目录
  220. create_log_dir
  221. # 记录脚本启动
  222. log_info "=========================================="
  223. log_info "Neo4j同步程序运行脚本启动"
  224. log_info "脚本路径: $0"
  225. log_info "启动时间: $(date)"
  226. log_info "=========================================="
  227. # 检查依赖
  228. if ! check_dependencies; then
  229. log_error "依赖检查失败,程序退出"
  230. exit 1
  231. fi
  232. # 检查Python包
  233. check_python_packages $([ "$install_packages" = true ] && echo "--install")
  234. # 如果只是检查依赖,则退出
  235. if [ "$check_only" = true ]; then
  236. log_info "依赖检查完成,程序退出"
  237. exit 0
  238. fi
  239. # 检查是否已在运行
  240. if [ "$force_run" = false ] && ! check_running; then
  241. log_error "程序已在运行或存在锁文件,程序退出"
  242. exit 1
  243. fi
  244. # 创建锁文件
  245. create_lock
  246. # 检查数据库连接
  247. check_database_connection
  248. # 运行主程序
  249. if run_main_program; then
  250. log_info "程序执行完成"
  251. exit 0
  252. else
  253. log_error "程序执行失败"
  254. exit 1
  255. fi
  256. }
  257. # 脚本入口点
  258. if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
  259. main "$@"
  260. fi