使用inotifywait和ssh进行目录镜像的脚本

时间:2015-09-16 09:31:31

标签: bash ssh inotifywait

我有一个脚本尝试将特定目录从本地服务器镜像到远程目录。它看起来像是:

inotifywait -mr --format '%w%f' -e close_write -e moved_to -e delete /mydir | \
while read FILECHANGE
do
    if [ -f $FILECHANGE ]
    then
        rsync --bwlimit=4096 --progress --relative -vrae 'ssh -p 22' $FILECHANGE $REMOTEHOST:/
    else
        ssh -p 22 $REMOTEHOST "rm $FILECHANGE"
    fi
done

如果有多个文件创建,例如触摸命令: touch 1 2 3 3个文件传输得很好。

但如果我一次删除多个文件: rm -f 1 2 3 只删除前一个。

如果我只用echo $FILECHANGE替换ssh命令,则3个文件在控制台中很好地显示。所以似乎问题来自ssh命令,但我无法解释原因并解决它。

任何人都是一个想法?

1 个答案:

答案 0 :(得分:0)

好吧,我发现了这个问题:似乎ssh命令在运行时正在吃输入inotifywait命令。因此,为了防止这种情况,我在ssh之后添加0<& - 重定向,以关闭stdin。

inotifywait -mr --format '%w%f' -e close_write -e moved_to -e delete /mydir | \
while read FILECHANGE
do
    if [ -f $FILECHANGE ]
    then
        rsync --bwlimit=4096 --progress --relative -vrae 'ssh -p 22' $FILECHANGE $REMOTEHOST:/
    else
        ssh -p 22 $REMOTEHOST "rm $FILECHANGE" 0<&-
    fi
done

现在可行。