start_scheduler.sh 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. #!/bin/bash
  2. # 多线程调度器启动脚本
  3. # 使用方法:
  4. # ./start_scheduler.sh start # 启动调度器
  5. # ./start_scheduler.sh stop # 停止调度器
  6. # ./start_scheduler.sh status # 查看状态
  7. # ./start_scheduler.sh restart # 重启调度器
  8. SCRIPT_NAME="multi_thread_scheduler.py"
  9. PID_FILE="scheduler.pid"
  10. LOG_DIR="logs"
  11. # 检查Python环境
  12. if ! command -v python3 &> /dev/null; then
  13. echo "错误: 未找到Python3,请先安装Python3"
  14. exit 1
  15. fi
  16. # 检查依赖文件
  17. if [ ! -f "indentify.py" ]; then
  18. echo "错误: 未找到indentify.py文件"
  19. exit 1
  20. fi
  21. if [ ! -f "multi_thread_scheduler.py" ]; then
  22. echo "错误: 未找到multi_thread_scheduler.py文件"
  23. exit 1
  24. fi
  25. # 创建logs目录
  26. mkdir -p logs
  27. # 获取进程ID
  28. get_pid() {
  29. if [ -f "$PID_FILE" ]; then
  30. cat "$PID_FILE"
  31. else
  32. echo ""
  33. fi
  34. }
  35. # 检查进程是否运行
  36. is_running() {
  37. local pid=$(get_pid)
  38. if [ -n "$pid" ]; then
  39. if ps -p "$pid" > /dev/null 2>&1; then
  40. return 0
  41. else
  42. # 进程不存在,删除PID文件
  43. rm -f "$PID_FILE"
  44. return 1
  45. fi
  46. fi
  47. return 1
  48. }
  49. # 启动调度器
  50. start_scheduler() {
  51. if is_running; then
  52. echo "调度器已经在运行中 (PID: $(get_pid))"
  53. return 1
  54. fi
  55. echo "正在启动多线程调度器..."
  56. echo "日志文件将保存在 $LOG_DIR/ 目录中"
  57. # 后台运行Python脚本
  58. nohup python3 "$SCRIPT_NAME" > "$LOG_DIR/scheduler_stdout.log" 2>&1 &
  59. local pid=$!
  60. # 保存PID到文件
  61. echo "$pid" > "$PID_FILE"
  62. echo "调度器已启动 (PID: $pid)"
  63. echo "使用以下命令查看状态:"
  64. echo " ./start_scheduler.sh status"
  65. echo " tail -f $LOG_DIR/scheduler_*.log"
  66. echo ""
  67. echo "使用以下命令停止:"
  68. echo " ./start_scheduler.sh stop"
  69. }
  70. # 停止调度器
  71. stop_scheduler() {
  72. local pid=$(get_pid)
  73. if [ -z "$pid" ]; then
  74. echo "调度器未运行"
  75. return 1
  76. fi
  77. echo "正在停止调度器 (PID: $pid)..."
  78. # 发送SIGTERM信号
  79. kill -TERM "$pid" 2>/dev/null
  80. # 等待进程结束
  81. local count=0
  82. while [ $count -lt 10 ] && ps -p "$pid" > /dev/null 2>&1; do
  83. sleep 1
  84. count=$((count + 1))
  85. echo "等待进程结束... ($count/10)"
  86. done
  87. # 如果进程仍在运行,强制杀死
  88. if ps -p "$pid" > /dev/null 2>&1; then
  89. echo "强制停止进程..."
  90. kill -KILL "$pid" 2>/dev/null
  91. fi
  92. # 删除PID文件
  93. rm -f "$PID_FILE"
  94. echo "调度器已停止"
  95. }
  96. # 查看状态
  97. show_status() {
  98. if is_running; then
  99. local pid=$(get_pid)
  100. echo "调度器正在运行 (PID: $pid)"
  101. echo "进程信息:"
  102. ps -p "$pid" -o pid,ppid,cmd,etime
  103. echo ""
  104. echo "最近的日志:"
  105. if [ -f "$LOG_DIR/scheduler_$(date +%Y%m%d).log" ]; then
  106. tail -5 "$LOG_DIR/scheduler_$(date +%Y%m%d).log"
  107. else
  108. echo "未找到今日日志文件"
  109. fi
  110. else
  111. echo "调度器未运行"
  112. fi
  113. }
  114. # 重启调度器
  115. restart_scheduler() {
  116. echo "重启调度器..."
  117. stop_scheduler
  118. sleep 2
  119. start_scheduler
  120. }
  121. # 主逻辑
  122. case "${1:-start}" in
  123. start)
  124. start_scheduler
  125. ;;
  126. stop)
  127. stop_scheduler
  128. ;;
  129. status)
  130. show_status
  131. ;;
  132. restart)
  133. restart_scheduler
  134. ;;
  135. *)
  136. echo "用法: $0 {start|stop|status|restart}"
  137. echo ""
  138. echo "命令说明:"
  139. echo " start - 启动调度器"
  140. echo " stop - 停止调度器"
  141. echo " status - 查看运行状态"
  142. echo " restart - 重启调度器"
  143. echo ""
  144. echo "示例:"
  145. echo " $0 start # 启动"
  146. echo " $0 status # 查看状态"
  147. echo " $0 stop # 停止"
  148. exit 1
  149. ;;
  150. esac