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 シェルで呼び出された場合はそれ自体で動作しますが、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 リポジトリに切り替えることはできません。
[アップデート]
に複数の ID ファイルがあります$HOME/.ssh/
。crontab から実行するときに、使用する ID ファイルを指定する必要がありますか? その場合、どのようにすればよいですか?
答え1
推測ですが (私は Unix の専門家ではありませんが、cron ジョブが実行されないという同様の問題がありました)、どのユーザーとしてタスクを実行していますか? そのユーザーには、必要なものすべてにアクセスするために必要なすべての権限がありますか?
私はそうは思わない (エラーはそう言っているようです! :-D )。
作業中のユーザーからログアウトし、別のユーザーとしてログインした場合、bash スクリプトは引き続き機能しますか? そうでない場合は、それがある程度役立ちます。
私たちが使用した解決策は、特定のユーザーとしてタスクを実行することでした。
これを行うにはいくつかの方法があるようです (常にそうではありませんか)。どれが他の方法よりも優れているかについてはコメントできません。それはあなたが決めることです。 crontab でどのユーザーがスクリプトを実行するかを指定するにはどうすればよいでしょうか?