CentOS8 systemd 自動啓動 jar

前不久華爲雲崩潰了,恢復以後還要登錄服務器手動把項目跑起來,emmm,萬一項目多幾個那不就尷尬了。作爲優秀勞動生產能手的我,當然還要了解一下自動化運維啊。那麼試試讓項目跟隨服務器啓動自啓吧。實驗所用的是 CentOS8 ,自啓方面跟測試服務器的 CentOS7 差別不大

首先,寫一個最簡單的 Springboot 應用,裏面放一個 web 頁面。項目結構大概就這樣,懂的都懂。因爲是測試的,所以這是很簡單了
懂的都懂
寫完打包成jar,上傳 CentOS8 。我放在 /home 路徑下,命名爲 auto-start-0.0.1-SNAPSHOT.jar

home
安裝 JDK 這種就不廢話了,接下來先寫一個手動啓動的腳本 autodeploy.sh

#!/bin/bash

export JAVA_HOME=/usr/java/jdk1.8.0_241-amd64
export PATH=${JAVA_HOME}/bin:${PATH}

APP_NAME="auto-start-0.0.1-SNAPSHOT.jar"

usage() {
    echo "case: sh run.sh [start|stop|restart|status]"
    exit 1
}

isExist(){
  #grep -v grep 反向選取記錄行,此處爲選取不帶grep內容的結果
  #awk 選取列
  pid=`ps -ef | grep ${APP_NAME} | grep -v grep | awk '{print $2}'`
  #如果不存在返回1,存在返回0
  if [ -z "${pid}" ]; then
    return 1
  else
    return 0
  fi    
}

start(){
  isExist
  if [ $? -eq "0" ]; then
    echo "${APP_NAME} is already running,pid = ${pid}."
  else
    nohup java -jar "/home/${APP_NAME}" > /dev/null 2>&1 &
    echo "${APP_NAME} start success"
  fi    
}

stop(){
   isExist
   if [ $? -eq "0" ]; then
     kill -9 ${pid}
   else
     echo "${APP_NAME} is not running"
   fi    
}

status(){
  isExist
   if [ $? -eq "0" ]; then
     echo "${APP_NAME} is running. Pid is ${pid}"
   else
     echo "${APP_NAME} is not running"
   fi  
}

restart(){
  stop
  start
}

case "$1" in
"start")
  start
  ;;
"stop")
  stop
  ;;
"status")
  status
  ;;
"restart")
  restart
  ;;
*)
usage
;;
esac

通過腳本也可以手動啓動項目,腳本會自檢項目是否啓動,並輸出對應的信息
腳本使用方法
腳本寫完,就是自啓的重頭戲,在 /etc/systemd/system 創建 autodeploy.service

[Unit]
Description=Springboot project for test auto start
After=syslog.target network.target nss-lookup.target
 
[Service]
User=root
Type=forking
# ExecStart=nohup java -jar /home/auto-start-0.0.1-SNAPSHOT.jar &
ExecStart=sh /home/autodeploy.sh start
ExecReload=sh /home/autodeploy.sh restart
ExecStop=sh /home/autodeploy.sh stop
 
[Install]
WantedBy=multi-user.target  

這裏不要用 ./home/autodeploy.sh start ,親測報錯…

寫完保存,執行

systemctl enable autodeploy.service

發現系統將創建一個軟連接到 /etc/systemd/system/multi-user.target.wants

此時重啓就可以完成自啓了
完成
至於在 ExecStart 直接寫命令還是通過腳本啓動,這件事,我覺得還是仁者見仁智者見智吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章