node-supervisor.sh 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #!/bin/bash
  2. # Configurable variables
  3. SOURCE_FILE=/workspaces/nginx-ui/tmp/main
  4. TARGET_PATH=/usr/local/bin/nginx-ui
  5. CONFIG_FILE=/etc/nginx-ui/app.ini
  6. # init nginx
  7. ./.devcontainer/init-nginx.sh
  8. LOG_PREFIX="[Supervisor]"
  9. # Debug initial state
  10. echo "$LOG_PREFIX Starting supervisor with:"
  11. echo "$LOG_PREFIX SOURCE_FILE: $SOURCE_FILE"
  12. echo "$LOG_PREFIX TARGET_PATH: $TARGET_PATH"
  13. echo "$LOG_PREFIX CONFIG_FILE: $CONFIG_FILE"
  14. # Wait for initial file creation
  15. while [[ ! -f "$SOURCE_FILE" ]]; do
  16. echo "$LOG_PREFIX Waiting for $SOURCE_FILE to be created..."
  17. sleep 1
  18. done
  19. # Initial copy and start
  20. echo "$LOG_PREFIX Initial file detected, starting service..."
  21. cp -fv "$SOURCE_FILE" "$TARGET_PATH"
  22. chmod +x "$TARGET_PATH"
  23. pkill -x nginx-ui || echo "$LOG_PREFIX No existing process to kill"
  24. nohup "$TARGET_PATH" -config "$CONFIG_FILE" > /proc/1/fd/1 2>&1 &
  25. # Use proper field separation for inotify output
  26. inotifywait -m -e close_write,moved_to,create,delete \
  27. --format "%T|%w%f|%e" \
  28. --timefmt "%F-%H:%M:%S" \
  29. "$(dirname "$SOURCE_FILE")" |
  30. while IFS='|' read -r TIME FILE EVENT; do
  31. echo "$LOG_PREFIX [${TIME}] Event: ${EVENT} - ${FILE}"
  32. # Handle atomic save operations
  33. if [[ "$FILE" =~ .*-tmp-umask$ ]] || [[ "$EVENT" == "DELETE" ]]; then
  34. echo "$LOG_PREFIX Detected build intermediate file, checking main..."
  35. sleep 0.3 # Allow atomic replace completion
  36. if [[ -f "$SOURCE_FILE" ]]; then
  37. echo "$LOG_PREFIX Valid main file detected after build"
  38. FILE="$SOURCE_FILE"
  39. else
  40. echo "$LOG_PREFIX Main file missing after build operation"
  41. continue
  42. fi
  43. fi
  44. if [[ "$FILE" == "$SOURCE_FILE" ]]; then
  45. # Stability checks
  46. echo "$LOG_PREFIX File metadata:"
  47. ls -l "$FILE"
  48. file "$FILE"
  49. # Wait for file stability with retries
  50. retries=5
  51. while ((retries-- > 0)); do
  52. if file "$FILE" | grep -q "executable"; then
  53. break
  54. fi
  55. echo "$LOG_PREFIX Waiting for valid executable (${retries} retries left)..."
  56. sleep 1
  57. done
  58. if ((retries <= 0)); then
  59. echo "$LOG_PREFIX ERROR: File validation failed after 5 retries"
  60. continue
  61. fi
  62. # Copy and restart service
  63. echo "$LOG_PREFIX Updating service..."
  64. cp -fv "$FILE" "$TARGET_PATH"
  65. chmod +x "$TARGET_PATH"
  66. echo "$LOG_PREFIX Killing existing process..."
  67. pkill -x nginx-ui || echo "$LOG_PREFIX No process to kill"
  68. echo "$LOG_PREFIX Starting new process..."
  69. nohup "$TARGET_PATH" -config "$CONFIG_FILE" > /proc/1/fd/1 2>&1 &
  70. echo "$LOG_PREFIX Restart complete. New PID: $(pgrep nginx-ui)"
  71. fi
  72. done