前不久華爲雲崩潰了,恢復以後還要登錄服務器手動把項目跑起來,emmm,萬一項目多幾個那不就尷尬了。作爲優秀勞動生產能手的我,當然還要了解一下自動化運維啊。那麼試試讓項目跟隨服務器啓動自啓吧。實驗所用的是 CentOS8 ,自啓方面跟測試服務器的 CentOS7 差別不大
首先,寫一個最簡單的 Springboot 應用,裏面放一個 web 頁面。項目結構大概就這樣,懂的都懂。因爲是測試的,所以這是很簡單了
寫完打包成jar,上傳 CentOS8 。我放在 /home 路徑下,命名爲 auto-start-0.0.1-SNAPSHOT.jar
安裝 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 直接寫命令還是通過腳本啓動,這件事,我覺得還是仁者見仁智者見智吧