実稼働サイトをマスターブランチと同期させるために、毎分git pull
を実行するタスクを含むcronjobを作成しようとしました。
パーミッションの問題のため、gitプルはシステムユーザーnobody
が行う必要があります。ただし、nobody
アカウントはコマンドの実行を許可されていないようです。そのため、root
ユーザーとしてタスクを作成する必要があります。
私が試したcrontabエントリ:
*/1 * * * * su -s /bin/sh nobody -c 'cd ~heilee/www && git pull -q Origin master' >> ~/git.log
動作せず、デバッグ方法もわかりません。
誰も助けてもらえますか?
更新1:git pull
コマンド自体は正しいです。エラーなしで実行できます。
溶液:
*/1 * * * * su -s /bin/sh nobody -c 'cd ~dstrt/www && /usr/local/bin/git pull -q Origin master'
そもそもアップデートを機能させる方法を理解する必要がありますが、アップストリームからフックを使用してそれを実行する方がはるかに良いでしょう。これは、post-commit
フック、またはgithubを使用している場合は、単に受信側のフックを使用します。
*/1 * * * * su -s /bin/sh nobody -c 'cd /home/heilee/src/project && /usr/bin/git pull Origin master'
これにより、受け入れられた回答がシステム(Ubuntu> 10.04サーバー)で機能しなくなるいくつかのエラーが修正されます。重要な変更点は、pull
の前ではなく-q
の後です。 /var/log/syslog
ファイルを末尾に置くか、更新されていない実稼働コードを実行しようとするまで、プルが機能しないことに気付かないでしょう。
#!/bin/bash
cd /home/your_folder/your_folder && /usr/bin/git pull [email protected]:your_user/your_file.git
それは私が使っていて働いていた
それに対処する小さなスクリプトを作成します。それから、コマンドcrontabを使用できます
crontab -e
0 2 * * * cd /root && ./gitpull.sh > /root/log/cron.log 2>&1 &
gitpull.sh
:
#!/bin/bash
source /etc/profile
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
export TERM=${TERM:-dumb}
#----------------------------------------
# Please set the following variable section
# Please set up working directories, use','split
# eg:path="/root/test/path1,/root/test/path2"
path=""
#----------------------------------------
# Do not edit the following section
# Check if user is root
[ $(id -u) != "0" ] && { echo "${CFAILURE}Error: You must run this script as root.${CEND}"; exit 1; } 2>&1
# Check if directory path exists
if [[ "${path}" = "" ]]; then
echo "${CFAILURE}Error: You must set the correct directory path.Exit.${CEND}" 2>&1
exit 1
fi
# Check if command git exists
if ! [ -x "$(command -v git)" ]; then
echo "${CFAILURE}Error: You may not install the git.Exit.${CEND}" 2>&1
exit 1
fi
# Check where is command git
git_path=`which git`
# Start to deal the set dir
OLD_IFS="$IFS"
IFS=","
dir=($path)
IFS="$OLD_IFS"
echo "Start to execute this script." 2>&1
for every_dir in ${dir[@]}
do
cd ${every_dir}
work_dir=`pwd`
echo "---------------------------------" 2>&1
echo "Start to deal" ${work_dir} 2>&1
${git_path} pull
echo "---------------------------------" 2>&1
done
echo "All done,thanks for your use." 2>&1
作業ディレクトリを設定する必要があります