仅当文件在 Linux 机器上完成上传后,才在 Java 应用程序服务器上部署 .war 文件

仅当文件在 Linux 机器上完成上传后,才在 Java 应用程序服务器上部署 .war 文件

在将 .war 或 .ear(只不过是 .zip 文件)上传到远程服务器并由应用服务器部署时,这个问题经常发生。

通常,在开发阶段,应用程序服务器处于“热部署”状态,这意味着应用程序服务器本身正在监听特定目录的变化,如果它识别到有效的应用程序文件(.ear 或 .war)已被放入其中,那么它将被解压并部署为 Java 应用程序。

上传正在进行时,通常会直接从开发环境中使用 ant 或 maven 等工具完成,应用服务器开始部署,但后来发现它是一个损坏的 zip 文件,因为上传尚未完成。

我发现的解决方法是上传到外部目录,然后连接到 ssh 并将文件 mv 到“热部署”位置。

你对如何处理这个问题有什么建议吗?我不是系统管理员,但我想要一种 shell 脚本(可能在 cron 下运行),它可以监听目录,当有上传(通过 scp)时,等到上传完成,然后对服务器目录执行 mv。

构建此脚本时我必须考虑哪些变量?

答案1

如果您想在部署服务器上自动执行此操作,您可以在上传.war 之后将一个文件(比如说“src.upload.complete.txt”)作为最后一个文件上传。

设置一个 crontab,每分钟检查一次“src.upload.complete.txt”文件,一旦找到,它就会将 .war 文件移动到部署目录。然后它还会删除“src.upload.complete.txt”文件。

我没有时间测试这个,但它可能是这样的:

要设置 crontab 每分钟检查一次,请将此行添加到/etc/crontab

* * * * * /path/to/bash/file.sh

file.sh看起来应该像这样。

#!/bin/bash

FILE_PATH = '/path/to/your/file'
if [ -f $FILE_PATH ]; 
then    
         mv /path/to/src.war /path/to/deploy.war    
         rm /path/to/src.upload.complete.txt 
fi

答案2

那么类似这样的情况呢:

scp my.war user@remote:/tmp && ssh user@remote 'mv /tmp/my.war /production/directory'

答案3

如果您使用 rsync 而不是 scp 来更新文件,它应该会创建一个具有不同名称的临时文件,然后在检查完整性时将其移动到正确的名称。我认为这或多或少是您需要的行为。默认选项应该可以做到这一点。如果您不使用任何特定选项,只需将 scp 替换为 rsync(man rsync有关详细信息,请参阅)。rsync sourcefile user@dest:/dest/directory/

相关内容