cron 的 rsync 问题,手动没有问题

cron 的 rsync 问题,手动没有问题

我有一个启动 rsync 命令的 backup.sh 文件。这个 rsync 是为了在运行 raspbian 的 RaspberryPi 上备份我的专用服务器。

(我使用钥匙串,所以我不需要输入任何密码等......)

问题是,当我手动启动批处理时,一切正常,但是当它是 crontab (使用同一用户)时,我出现以下错误:

2013/10/07 19:36:02 [6456] rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
2013/10/07 19:36:02 [6456] rsync error: error in rsync protocol data stream (code 12) at io.c(605) [Receiver=3.0.9]

这是我的 backup.sh 文件

#!/bin/bash

echo "_ backup start "$(date +%H:%M:%S)
echo " "

/usr/bin/rsync -avh --rsync-path='/usr/bin/rsync' --delete --log-file='/home/user/rsync.'$(date +%d%m%Y-%H%M%S)'.log' --rsh='ssh -p 1234' [email protected]:/path/to/archives/ /media/backup/

echo " "
echo "_ backup end "$(date +%H:%M:%S)

现在是 crontab 行 (crontab -e)

# m h  dom mon dow   command
 30 5  *   *   *     /home/user/backup.sh | mail -s "Backup RPi "$(date +\%d/\%m/\%Y-\%X) [email protected]

问候

答案1

(我使用钥匙串,所以我不需要输入任何密码等......)

好的,所以您需要告诉 cron 作业中运行的程序如何找到您的钥匙串。

SSH 通过环境变量寻找 SSH 代理(钥匙串模拟)SSH_AUTH_SOCK。所以你需要在你的 crontab 中设置这个环境变量。

在典型配置中,SSH_AUTH_SOCK是具有随机名称的套接字的路径。由于您使用的是钥匙串,因此您可以轻松找到该套接字的备用名称:钥匙串将文件写入包含~/.keychain设置SSH_AUTH_SOCK和其他类似变量(SSH_AGENT_PIDGPG_AGENT_INFO)的环境变量声明。因此,只需在您的 cron 作业中包含适当的文件即可。

[email protected]
30 5  *   *   *     . ~/.keychain/$(hostname)-sh; /home/user/backup.sh

(旁白:cron 有一个内置功能可以发送带有作业输出的邮件,这样您只有在作业确实产生一些输出时才会收到邮件。无需摆弄| mail。)

答案2

ssh 连接无法通过 cronjob 工作。它应该如何执行 SSH 身份验证?没有看到列出身份密钥或密码的尝试。如果这就是它的工作原理,我会将“-i”与您的(无密码...)密钥的路径粘贴在一起。命令行和 cronjob 之间的主要区别往往取决于环境(环境变量、缺少控制终端等)

答案3

我认为您在主题上存在引用问题:

mail -s "Backup RPi "$(date +\%d/\%m/\%Y-\%X) [email protected]

应该是这样的:

mail -s "Backup RPi $(date +\%d/\%m/\%Y-\%X)" [email protected]

替代方法

我也会将电子邮件包装到脚本中。

#!/bin/bash

(
  echo "_ backup start "$(date +%H:%M:%S)
  echo " "

  /usr/bin/rsync -avh --rsync-path='/usr/bin/rsync' --delete \
     --log-file='/home/user/rsync.'$(date +%d%m%Y-%H%M%S)'.log' \
     --rsh='ssh -p 1234' [email protected]:/path/to/archives/ /media/backup/

  echo " "
  echo "_ backup end "$(date +%H:%M:%S)
) | mail -s "Backup RPi $(date +\%d/\%m/\%Y-\%X)" [email protected]

然后将 crontab 条目更改为:

30 5  *   *   *     /home/user/backup.sh

还要确保运行此 cron 的帐户实际上可以发送电子邮件。做一个测试。

相关内容