Cách viết Shell Script quản lý ứng dụng Spring Boot trên Linux

Để vận hành ứng dụng Spring Boot trên máy chủ Linux một cách hiệu quả, việc tạo script tự động là giải pháp thực tế nhất. Bài viết này trình bày quy trình chi tiết từ cấu hình môi trường đến triển khai script quản lý đầy đủ chức năng.

1. Chuẩn bị môi trường runtime

Đầu tiên cần cài đặt JDK phù hợp. Kiểm tra phiên bản Java hiện có:

java -version

Nếu chưa cài đặt hoặc phiên bản không tương thích, hãy cài đặt OpenJDK hoặc Oracle JDK theo hướng dẫn chính thức của distribution Linux đang sử dụng.

2. Đặt file JAR vào vị trí cố định

Sao chép file JAR đã build vào thư mục ổn định, ví dụ:

/opt/springboot/services/user-management-api.jar

Đảm bảo file có quyền đọc/execute cho user sẽ chạy dịch vụ.

3. Xây dựng script quản lý toàn diện

Tạo file app-manager.sh với nội dung sau:

#!/bin/bash

# Thư mục chứa ứng dụng
APP_HOME="/opt/springboot/services"

# Tên dịch vụ (không bao gồm .jar)
SERVICE_NAME="user-management-api"

# Đường dẫn tới file JAR
JAR_FILE="$APP_HOME/$SERVICE_NAME.jar"

# Cấu hình tham số JVM
JVM_PARAMS="-server -Xms512m -Xmx1g"

# File lưu PID
PID_FILE="$APP_HOME/$SERVICE_NAME.pid"

# File log theo ngày
LOG_FILE="$APP_HOME/logs/$SERVICE_NAME-$(date +%Y%m%d).log"

# Hàm kiểm tra trạng thái
status_check() {
  if [ -f "$PID_FILE" ]; then
    local PID=$(cat "$PID_FILE")
    if ps -p "$PID" > /dev/null 2>&1; then
      return 0
    fi
  fi
  return 1
}

# Hàm khởi động dịch vụ
launch() {
  echo "Đang kiểm tra trạng thái dịch vụ..."
  if status_check; then
    echo "Dịch vụ đang chạy với PID $(cat $PID_FILE)"
    exit 0
  fi
  
  echo "Khởi động dịch vụ $SERVICE_NAME..."
  mkdir -p "$APP_HOME/logs"
  
  nohup java $JVM_PARAMS -jar "$JAR_FILE" > "$LOG_FILE" 2>&1 &
  local PID=$!
  echo $PID > "$PID_FILE"
  
  sleep 3
  if ps -p $PID > /dev/null; then
    echo "Dịch vụ khởi động thành công (PID: $PID)"
  else
    echo "Khởi động thất bại, kiểm tra log tại $LOG_FILE"
    rm -f "$PID_FILE"
    exit 1
  fi
}

# Hàm dừng dịch vụ
terminate() {
  echo "Đang kiểm tra trạng thái dịch vụ..."
  if ! status_check; then
    echo "Dịch vụ không đang chạy."
    rm -f "$PID_FILE"
    exit 0
  fi
  
  local PID=$(cat "$PID_FILE")
  echo "Dừng dịch vụ $SERVICE_NAME (PID: $PID)..."
  
  kill "$PID"
  local COUNT=0
  while [ $COUNT -lt 30 ]; do
    if ! ps -p "$PID" > /dev/null; then
      break
    fi
    sleep 1
    ((COUNT++))
  done
  
  if ps -p "$PID" > /dev/null; then
    echo "Dừng không thành công, buộc dừng..."
    kill -9 "$PID"
  fi
  
  rm -f "$PID_FILE"
  echo "Dịch vụ đã dừng hoàn toàn."
}

# Hàm khởi động lại
reload() {
  terminate
  sleep 2
  launch
}

# Xử lý lệnh
case "$1" in
  start)
    launch
    ;;
  stop)
    terminate
    ;;
  restart)
    reload
    ;;
  status)
    if status_check; then
      echo "Dịch vụ đang chạy (PID: $(cat $PID_FILE))"
    else
      echo "Dịch vụ đang dừng"
    fi
    ;;
  *)
    echo "Sử dụng: $0 {start|stop|restart|status}"
    exit 1
    ;;
esac

Lưu ý thay đổi giá trị APP_HOME, SERVICE_NAME, và JVM_PARAMS phù hợp với dự án thực tế.

4. Cấp quyền và thiết lập an toàn

Phân quyền thực thi cho script:

chmod +x app-manager.sh

Nên tạo user chuyên dụng để chạy dịch vụ thay vì dùng root:

sudo useradd -r -s /bin/false springboot
sudo chown -R springboot:springboot /opt/springboot/services

5. Vận hành và giám sát

Sử dụng script với các tùy chọn:

# Khởi động
./app-manager.sh start

# Dừng dịch vụ
./app-manager.sh stop

# Khởi động lại
./app-manager.sh restart

# Kiểm tra trạng thái
./app-manager.sh status

Để tự động khởi động cùng hệ thống, tạo systemd service file hoặc crontab cho user.

Thẻ: spring-boot shell-script linux bash-scripting java-deployment

Đăng vào ngày 30 tháng 8 lúc 19:40