我正在尝试在 crontab 中自动更新版本控制存储库。以下脚本/home/usr/mrbean/bin/update.sh
适用于交互式 Bash 命令行:
#!/bin/bash
ROOTPATH="/home/user/mrbean/temp/"
cd $ROOTPATH
SSHTMPFILE="${ROOTPATH}ssh-agent.cf"
ssh-agent -s | head -n 2 > "$SSHTMPFILE"
function killsshagent {
/bin/kill $SSH_AGENT_PID
}
trap killsshagent EXIT
if [ -f "$SSHTMPFILE" ]; then
source "$SSHTMPFILE"
ssh-add
rm "$SSHTMPFILE"
fi
killsshagent
if [ `hostname` == "mrbeancomp.local" ]; then
REPODIR="/home/usr/mrbean/repo/"
cd $REPODIR
cvs update -dP > "$HOME/log/log.txt"
fi
然后我添加
@hourly /home/usr/mrbean/bin/update.sh
当在交互式 Bash shell 中调用该脚本时,该脚本将按其顺序运行,但不能通过 crontab 调用。它给出错误并发送到系统邮件/var/mail/mrbean
:
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,gssapi-with-mic,password).
cvs [update aborted]: end of file from server (consult above messages if any)
[更新]
killsshagent
添加到程序中,因此ssh-agent
不是悬空的。
[更新]
在 Git 存储库上尝试了一个改编的程序并遇到了同样的问题。 Mr. Bean 不能立即放弃这个 CVS 存储库并切换到新的 Git 存储库。
[更新]
我有多个身份文件$HOME/.ssh/
。从 crontab 运行时是否可能需要指定要使用的身份文件?如果是这样,怎么办?
答案1
猜测一下(我不是 unix 专家,但也遇到过 cron 作业未运行的类似问题),您以什么用户身份执行任务?该用户是否拥有访问您所需的所有内容所需的所有权限?
我怀疑不是(错误是这样说的!:-D)。
如果您从工作用户注销并以其他用户身份登录,bash 脚本仍然可以工作吗?如果没有,那么这确实有帮助。
我们使用的解决方案是以特定用户身份运行任务。
似乎有几种方法可以做到这一点(并非总是如此)。我无法评论其中一个相对于另一个的优点 - 这将由您决定。 如何在crontab中指定由什么用户运行脚本?