在将 .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/