![cron 的 rsync 问题,手动没有问题](https://linux22.com/image/51065/cron%20%E7%9A%84%20rsync%20%E9%97%AE%E9%A2%98%EF%BC%8C%E6%89%8B%E5%8A%A8%E6%B2%A1%E6%9C%89%E9%97%AE%E9%A2%98.png)
我有一个启动 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_PID
,GPG_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 的帐户实际上可以发送电子邮件。做一个测试。