0

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

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 只删除第一个文件。

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

任何人的想法?

4

1 回答 1

0

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

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

现在它起作用了。

于 2015-09-16T13:17:27.393 回答