我正在尝试在我的服务器中维护来自远程服务器的一堆文件的副本,并且每 15 分钟将过去 15 分钟内更改的文件(自上次拉取以来)带到我的服务器
这些文件最终可能会从我的备份服务器中删除,也可能不会,所以我不想 rsync 所有文件,因为这会每 15 分钟重新复制一次我已删除的文件。
为了实现这一点,我每 15 分钟执行一次 rsync,以获取过去 15 分钟内发生变化的文件,在 crontab 中采用以下方式:
*/15 * * * * rsync -av --files-from=<(ssh root@remote-server 'find /remote/directory -type f -name remote-server-files.* -mmin -15 -exec basename {} \;' ) root@remote-server://remote/directory /local/directory 2> /var/log/rsync_cron.log && echo "[$(date)] Remote files saved successfully" >> /var/log/rsync_cron.log
当我在 shell 中运行此命令时,它运行正常。
但是,当 crontab 运行它时,它会抛出以下错误:
rsync: failed to open files-from file <(ssh root@remote-server find /remote/directory -type f -name remote-server-files.* -mmin -15 -exec basename {} \; ): No such file or directory rsync error: syntax or usage error (code 1) at main.c(1422) [client=3.0.6]
因此看起来 crontab 不会扩展内部命令并执行它来获取文件列表。
有什么办法可以让 crontab 正常执行命令吗?我宁愿不为一行代码创建脚本
答案1
我自己已经弄清楚了。
问题是 crontab 默认不在 bash 上运行,而是在 sh 上运行。
我在 crontab 的顶部添加了这一行,现在它运行正常:
外壳=/bin/bash