运维脚本示例:应用发布(Java / Tomcat 与 PHP)
典型流程:拉代码 → 构建或同步 → 重启/覆盖站点;脚本仅供参考,注意环境与权限风险。
一、Java:Maven 构建 + Tomcat 部署 WAR
参数 $1 为 Tomcat 目录名(脚本里拼成 /usr/local/$TOMCAT_NAME)。流程:clone/pull Git、mvn package、查 PID 杀进程、备份旧 ROOT、解压 war、startup.sh。
shell
#!/bin/bash
DATE=$(date +%F_%T)
TOMCAT_NAME=$1
TOMCAT_DIR=/usr/local/$TOMCAT_NAME
ROOT=$TOMCAT_DIR/webapps/ROOT
BACKUP_DIR=/data/backup
WORK_DIR=/tmp
PROJECT_NAME=tomcat-java-demo
# 拉取代码
cd $WORK_DIR
if [ ! -d $PROJECT_NAME ]; then
git clone https://github.com/lizhenliang/tomcat-java-demo
cd $PROJECT_NAME
else
cd $PROJECT_NAME
git pull
fi
# 构建
mvn clean package -Dmaven.test.skip=true
if [ $? -ne 0 ]; then
echo "maven build failure!"
exit 1
fi
# 部署
TOMCAT_PID=$(ps -ef |grep "$TOMCAT_NAME" |egrep -v "grep|$$" |awk 'NR==1{print $2}')
[ -n "$TOMCAT_PID" ] && kill -9 $TOMCAT_PID
[ -d $ROOT ] && mv $ROOT $BACKUP_DIR/${TOMCAT_NAME}_ROOT$DATE
unzip $WORK_DIR/$PROJECT_NAME/target/*.war -d $ROOT
$TOMCAT_DIR/bin/startup.sh补充说明
kill -9强制结束 JVM,可能导致事务未完成;优雅停机可用catalina.sh stop或 systemd。ps | grep取 PID 容易误杀同名进程,更稳妥的是读catalina.pid(若配置)或 jps。unzip到 ROOT:需确认 war 内结构;部分团队改为webapps/app.war由 Tomcat 自动解压。- Git 地址、分支应参数化;生产应用 CI/CD、制品库与 蓝绿/金丝雀 发布。
二、PHP:Git 同步到 Nginx 站点目录
参数 $1 作为 /usr/local/nginx/html/ 下子目录名;无构建步骤,rsync 同步仓库(排除 .git)。
shell
#!/bin/bash
DATE=$(date +%F_%T)
WWWROOT=/usr/local/nginx/html/$1
BACKUP_DIR=/data/backup
WORK_DIR=/tmp
PROJECT_NAME=php-demo
# 拉取代码
cd $WORK_DIR
if [ ! -d $PROJECT_NAME ]; then
git clone https://github.com/lizhenliang/php-demo
cd $PROJECT_NAME
else
cd $PROJECT_NAME
git pull
fi
# 部署
if [ ! -d $WWWROOT ]; then
mkdir -p $WWWROOT
rsync -avz --exclude=.git $WORK_DIR/$PROJECT_NAME/* $WWWROOT
else
rsync -avz --exclude=.git $WORK_DIR/$PROJECT_NAME/* $WWWROOT
fi补充说明
if分支里 rsync 两段相同,可合并为一个逻辑;可增加--delete(慎用,会删目标多余文件)。DATE、BACKUP_DIR脚本中未使用,若上线需回滚可先在 rsync 前备份整个$WWWROOT。- PHP-FPM
reload、Opcache 清理视框架而定(Laravel/Symfony 可能还需php artisan)。 - 旧稿中的社交群信息属于课程推广,合并时已从正文删除,仅保留技术脚本。
三、发布检查清单(建议)
- 构建或同步成功后再 reload/restart,尽量 health check。
- 敏感信息(DB 密码、密钥)勿写进仓库;用环境变量或密钥管理。
- 关键操作 日志落盘、失败 告警,与 告警与初始化 中的邮件/Webhook 联动。
