为了备份我的 sql 数据库,我运行了一个 cron 作业,该作业会生成 mysql 转储。现在我想创建另一个 cron 作业,将该转储提交到存储库,但现在的问题是它不起作用。
在 cron 日志中,我看到命令运行但未提交任何内容的行。
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
MAILTO=root
HOME=/
49 16 * * * cd /path/to/backup/folder/ && /usr/local/bin/git commit -am "Updating DB backup"
这是我在 crontab -e 中输入的内容。我也在 /etc/crontab 中尝试过,我将 root 设置为用户,这样可以正常工作,但只有 root 用户才能正常工作,这是一个问题,因为 git post-commit 钩子会在提交某些内容后进行推送。由于只有我的用户可以推送,因此当 root 执行提交时,此操作不起作用。
由于它是以 root 用户身份运行的,因此我认为这是一个权限问题,但是权限是什么呢?这些命令在普通命令行中运行。
当捕获 stdout 和 stderr 时,我在日志中得到以下内容。
Permission denied (publickey).^M
fatal: The remote end hung up unexpectedly
所以它实际上并没有以我的用户身份运行或者找不到密钥?
答案1
您的 cron 文件的格式(即您输入 crontab -e 时得到的格式)与系统 cron 文件不同。您无需在用户 cron 文件中指定用户,它会以您的身份自动运行。尝试:
49 16 * * * cd /path/to/backup/folder/ && /usr/local/bin/git commit -am "Updating DB backup"
我还建议捕获 stdout 和 stderr,以便您可以实际看到提交所做的事情,例如:
49 16 * * * cd /path/to/backup/folder/ && /usr/local/bin/git commit -am "Updating DB backup" >> /path/to/logfile 2>&1
编辑以添加:现在您已经显示了来自 stdout/stderr 的输出,问题就很清楚了。ssh 找不到您的密钥,这可能是由于您设置
HOME=/
它可能应该是这样的
HOME=/home/me
或者,您也可以不设置它。
答案2
您可能正在使用其他用户设置 crontab。检查您是否正在执行“sudo crontab -e”,然后尝试使用您的用户或 git 和文件的所有者执行“crontab -e”。
这对我很有帮助,所以也许对你也有用。