我正在使用每 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
。