【问题标题】:How to execute bash script after rsyncrsync后如何执行bash脚本
【发布时间】:2013-08-12 11:34:40
【问题描述】:

当我在我的开发服务器上部署时,我使用 rsync。但是在 rsync 之后,我需要执行一个 .sh 文件来执行“之后”部署操作,例如清除缓存...

通常我是通过 SSH 来完成的,但如果我经常部署,写起来很无聊:

  • ssh ...
  • 写密码
  • cd /var/www/myapp/web
  • ./after_deploy.sh

有没有办法快速做到这一点?这是我的 rsync.sh:

#!/bin/bash
host=""
directory="/var/www/myapp/web"
password=""
usage(){
        echo "Cant do rsync";
        echo "Using:";
        echo "   $0 direct";
        echo "Or:";
        echo "   $0 dry";
}
echo "Host: $host";
echo "Directory: $directory"
if [ $# -eq 1 ]; then
        if [ "$1" == "dry" ]; then
                echo "DRY-RUN mode";
                rsync -CvzrltD --force --delete --exclude-from="app/config/rsync_exclude.txt" -e "sshpass -p '$password' ssh -p22" ./ $host:$directory --dry-run
        elif [ "$1" == "direct" ]; then
                echo "Normal mode";
                rsync -CvzrltD --force --delete --exclude-from="app/config/rsync_exclude.txt" -e "sshpass -p '$password' ssh -p22" ./ $host:$directory
        else
                usage;
        fi;
else
        usage;
fi

【问题讨论】:

  • shell 脚本必须在您的主机系统上执行还是远程执行?
  • 必须远程执行

标签: bash unix rsync


【解决方案1】:

您可以在rsync 命令之后添加一个命令来执行它,而不是启动一个shell。

在 rsync 命令后添加以下内容:

sshpass -p "$password" ssh $host "cd $dir && ./after_deploy.sh"

【讨论】:

  • 你能帮我把你的线更好地换成我的吗?我无法在没有错误的情况下替换它...我认为引用错误。
【解决方案2】:

如果您在服务器上运行 rsync 守护程序而不是通过 SSH 使用 rsync,则可以使用 /etc/rsyncd.conf 中的 pre-xfer execpost-xfer exec 选项来指定要在传输之前和/或之后运行的命令。

例如在/etc/rsyncd.conf中:

[myTransfers]
     path = /path/to/stuff
     auth users = username
     secrets file = /path/to/rsync.secrets
     pre-xfer exec = /usr/local/bin/someScript.sh
     post-xfer exec = /usr/local/bin/someOtherscript.sh

然后您可以从客户端机器进行传输,相关脚本将在服务器上自动运行,例如:

rsync -av . username@hostname::myTransfers/ 

这种方法也可能很有用,因为脚本也可以使用与服务器上的传输相关的环境变量。

更多信息请参见https://linux.die.net/man/5/rsyncd.conf

【讨论】: