rsync 与 cron 任务每分钟发生问题

rsync 与 cron 任务每分钟发生问题

我正在使用每 1 分钟运行一次的 cron 作业中的 rsync 通过网络传输文件,任务是每当有新文件出现时它必须开始在远程服务器上上传:

因为我是新手所以在这里犯了一个大错误:

* * * * * rsync -azP /local_path [email protected]:/remote_path > /dev/null

rsync 创建临时文件(在远程端),下一分钟它再次创建临时文件(在远程端),几分钟后我的网络开始阻塞并且没有上传带宽,然后我终止所有 rsync 进程并一次复制。

需要这个自动化,请帮忙。

谢谢

答案1

看起来这是因为该命令运行需要一分钟以上的时间,所以命令会堆积起来,直到系统资源匮乏。

rsync您可以使用锁文件来 确保只有一个实例运行。util-linux包括一个名为的文件锁定包装器flock,您可以在 crontab 中使用它,如下所示:

* * * * * /usr/bin/flock -n '/tmp/example.lock' -c 'rsync -azP /local_path [email protected]:/remote_path' > /dev/null

在上面的例子中,锁文件路径是/tmp/example.lock,但您可以将其设置为任何合理的路径。 -n将防止flock命令堆积,因为它会立即退出,而不是等待锁被释放才能继续。


另外,你也可以通过编写一个带有相当简单的锁的脚本来防止 cron 命令堆积,该锁可确保每次只能运行一个脚本实例:

#!/bin/bash

PIDFILE=/tmp/example.pid

if [ -f "$PIDFILE" ]
then
        PID="$(cat "$PIDFILE")"
        ps -p $PID > /dev/zero 2>&1
        if [ $? -eq 0 ]
        then
                echo "Instance of this script is still running as PID $PID"
                exit 1
        fi
fi

echo $$ > $PIDFILE
if [ $? -ne 0 ]
then
        echo "Could not create PID file: $PIDFILE"
        exit 1
fi

# YOUR CODE GOES BELOW
rsync -az /local_path [email protected]:/remote_path
# YOUR CODE GOES ABOVE

rm -f "$PIDFILE"

锁定机制灵感源自防止重复执行 cron 作业作者:Benjamin Cane

请注意,脚本的主要限制是,如果由于某种原因未删除 PID 文件并且另一个进程具有相同的 PID,则脚本将错误退出。

将此脚本保存在某个地方,例如/usr/local/bin/example.sh,,chmod +x /usr/local/bin/example.sh然后从 crontab 中调用它,如下所示:

* * * * * /usr/local/bin/example.sh > /dev/null

答案2

首先删除-P选项,cron 就真的看不到进度了。

您需要实现一些锁定机制,不要rsync直接从 cron 调用,而是制作一些将在 cron 中使用的脚本。在脚本中,检查第一个条件是否rsync已在运行(例如 grep ps 输出),如果正在运行,则只需退出脚本,否则运行rsync

相关内容