我正在开发一个服务器应用程序。我有一台装有 Debian 的远程计算机,用于测试。目前,当每个新的 svn 版本出现时,我都会手动更新服务器。它只是一个测试服务器,其上的流量对我来说是免费的。我创建了一个简单的脚本,用于下载最新的 svn ( HEAD
) 修订版并重新编译我的服务器。
我想知道是否可以创建一个 .sh 脚本(与 Debian 兼容),普通用户(不是 SU)可以从类似的内容开始,nohup ./superScript.sh >& /dev/null &
并且每分钟查看一次 SVN,找出当前版本,如果有更新,运行如下命令:
kill `ps aux | grep -F 'ServerAPP' | grep -v -F 'grep' | awk '{ print $2 }'`
./server_automated_net_setup.sh
cd server/install-dir/
export LD_LIBRARY_PATH=./:~/server/install-dir/lib_boost:~/server/install-dir/lib_openSSL
nohup ./ServerAPP >& /dev/null &
这将终止当前正在运行的应用程序,运行我们在用户主页 ( ~
) 中已有的一些自动更新脚本,然后再次运行它。
是否可以创建这样的脚本以及如何创建?
答案1
好吧,任何脚本都可以编写,但我首先想到监控和更新的方法略有不同(我恨每分钟连接到仓库)
- 如果您可以管理存储库,则将通知从存储库推送到服务器,而不是从服务器提取存储库(存储库中的提交后挂钩可以执行此操作)几乎所有东西)
- 在“提交发生”事件服务器上运行脚本,其中
svn up
代码到本地工作副本svn export
从 WC 到某个位置的代码- ...执行所有其他步骤
如果您无法使用存储库挂钩,请添加svn up | grep + some code
用户的 crontab。
需要使用 grep for svn up 来区分有数据的更新和无数据的更新。
真实更新(示例)
>svn up
Updating '.':
U index.html
Updated to revision 9012.
空更新
>svn up
Updating '.':
At revision 9012.
受影响物体前面的字母显示动作
A Added
D Deleted
U Updated
C Conflict
G Merged
E Existed
R Replaced
答案2
您可以将所有这些命令合并到一个.sh
文件中,如下所示:
#!/bin/bash
kill `ps aux | grep -F 'ServerAPP' | grep -v -F 'grep' | awk '{ print $2 }'`
/full/path/to/server_automated_net_setup.sh
export LD_LIBRARY_PATH=./:~/server/install-dir/lib_boost:~/server/install-dir/lib_openSSL
nohup /full/path/to/ServerAPP >& /dev/null &
将其全部粘贴到文件中yourname.sh
并使其可执行:
chmod +x yourname.sh
此外,还可以直接从 script 结帐svn co url://
,并且您将能够自动化整个过程。
答案3
要回答有关普通用户的问题,如果您的程序(假设基于网络的服务器)使用非特权端口(大于 1000),则用户无需 su/sudo 即可运行它。
采取不同的看法。
if ./server_automated_net_setup.sh; then
kill `ps x --no-header --format=pid,cmd | awk '!/awk/&&/ServerAPP/{print $1}'` 2>&-
cd $HOME/server/install-dir
nohup env LD_LIBRARY_PATH=./:$HOME/server/install-dir/lib_boost:$HOME/server/install-dir/lib_openSSL ./ServerAPP >& /dev/null &
fi
如果更新和重建了某些内容,则需要更改server_automated_net_setup.sh
为返回成功( ) ,如果没有任何更改,则返回失败()。0
1
然后在每个周期从 cron 调用这个脚本。如果您有每一分钟的时间,则更新和重建软件之间可能会出现过多的磁盘抖动。也没有什么可以阻止您自己调用脚本。
对于server_automated_net_setup.sh
,我会做一些接近的事情:
wcdir=$HOME/source/myworkingcopy
if [ -n `svn status -qu $wcdir | awk '/^........\*/'` ]; then
gmake -C $wcdir svn-update rebuild deploy
echo $?
else
exit 1
fi
将gmake
在部分构建之前执行 svn+update 并将工件复制到安装目录(部署)。