我正在嘗試在 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中指定由什麼使用者執行腳本?