为什么我无法将参数从 cron 传递到 shell 脚本

为什么我无法将参数从 cron 传递到 shell 脚本

通过这个 cron 脚本,我试图让 Rsync 工作

*/1 * *    * * /root/backup.sh  `date +today/\%M`

以及如下所示的 shell 脚本

#!/bin/bash -x
PATH=/bin:/usr/bin:/sbin:/usr/sbin
REMOTE="REMOTEADDRESS"
RSYNC=/usr/bin/rsync

评论:这个有效

$RSYNC -aqz --exclude-from '/home/root/backups/backup-exclude.txt' /var/www/html $REMOTE:backups/

评论:这失败了

$RSYNC -aqz  --exclude-from '/home/root/backups/backup-exclude.txt' /var/www/html $REMOTE:$1/

我无法理解为什么传递的参数没有正确传递给脚本。在日志中,一切看起来都应该如此。

更新 cron 传递参数而不将其包含在脚本中的原因是有一个备份计划,该计划允许: - 每天每小时覆盖一次备份 - 每月覆盖一次每天备份 - 每月一次持久备份

传递参数时的错误是RSync无法在远程服务器上mkdir。它可以与任何静态线路一起使用。日志显示使用当前 cron 时传递的正确目录。

答案1

dest/dir您必须确保远程计算机中存在您尝试复制到的目录( ):

rsync -aqz ./ user@host:dest/dir

至少,所有目录(最后一个目录除外)都应该已经存在。这与 mkdir 的行为相同mkdir: mkdir 只会创建最后一个目录(默认情况下,该-p选项可以更改它)。也就是说:除非远程计算机上存在,rsync否则将会失败。/home/user/dest/dir

那是与相对的目录。

同样的情况也发生在绝对目录(以 开头的目录/):

rsync -aqz ./ user@host:/home/user/dest/dir

规则完全相同,但目录不同假定位于用户主目录,但可以位于任何地方(当然,用户必须具有写入权限)。


在附加测试中,我发现 ifrsync将使用如下目录:

newdir/testdir

至少目录 newdir 必须存在。这与 mkdir 完全相同。mkdir newdir/testdir如果没有newdirdir,A将失败。

我使用与您报告的相同的脚本对其进行了测试:

  • 与固定目录一起使用,
  • 参数上的给定目录,
  • 脚本$1参数上的给定目录
  • 无论有没有 cron,上述所有内容都会重复。

在所有情况下,缺少初始目录两部分目录获取 rsync 失败。

相关内容