Để 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.