当我运行rsync
命令将文件推送到生产环境时,有时(并非总是如此,而且这种情况非常罕见)在同步完成后,我们会在生产环境中遇到错误。
命令rsync
是;
rsync -avzO --exclude=*.git --exclude=*.log /var/www/html/ver_1/api [email protected]:/var/www/html/ver_1
我已确认以下内容;
- 生产和测试环境设置(PHP 和 Apache)相互镜像
- 问题有与命令一起使用,
rsync
因为当我手动复制文件时(使用WinSCP)没有问题 - 所以这不是代码错误。 - 我们正在从一台 CentOS 机器同步到另一台 CentOS 机器(如果这有什么不同的话)
问题
- 可能是什么原因导致了这个问题?
- 为什么它只是偶尔发生(25 次中有 2/3 次)
- 我怎样才能解决这个问题,或者尽量减少这种情况的发生?
编辑
PHP Fatal error: require_once(): Cannot redeclare class api\lib\classapitools\apitools in /var/www/html/ver_1/api/index.php on line 42
- 我已将 index.php 文件从测试复制到生产,但没有修复它。
- 重新运行rsync命令,并没有修复它。
- 然后我手动复制了所有文件并且它起作用了。我调试了整个应用程序,但它没有返回任何有关该错误的深入信息(我知道为什么会出现错误(一般意义上),但似乎
rsync
对整个应用程序进行了 FUBAR,直到手动同步)
答案1
问题很可能在于您-a
在 rsync 上使用了标志。这相当于一组其他选项,包括-t
,它保留文件的修改时间。
由于您不在目标计算机上重新启动应用程序,因此您现在依赖于该计算机是否重新读取部分或全部这些文件,具体取决于应用程序以及是否观察到这些文件被更改。
您尝试使用-rlpgoD
而不是-a
.在前一个 rsync 中传输的文件的“错误”时间戳(但不是当前的)不应造成任何麻烦,rsync
即使时间戳不同,也足够聪明地注意到内容是相同的。
如果您一直使用该--in-place
选项,您可能会遇到更多问题。