質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

3回答

2075閲覧

GitHubからLinuxサーバーにPULLするバッチ処理について

hyskyo

総合スコア79

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

1クリップ

投稿2016/08/31 11:53

編集2022/01/12 10:55

問題:GitHubからLinuxサーバーにあるディレクトリーに自動的にリアルタイムでPullできるようにはなっていますがいくつかのディレクトリーに同時にPULLした時にプロセスの処理が次々と実行されてサーバーが落ちしまいます。

質問・実行したいこと:
どうしたい上記の問題を解決できますか?
これを先のプロセスが終わってから次の処理が実行できるように変更したいのですが良くわからなくて誰かが教えていただきますか?

こちらのGitバッチ処理です.

#!/bin/bash #指定されたブランチをpullする export PATH=$PATH:/usr/local/bin GIT_DIR=.git # pull対象ブランチ BRANCH_ARR=("master" "master") # 更新対象ディレクトリ DIR=/var/www/vhosts/system DIR_ARR=("bokemon" "lalago") # log LOG=/var/www/vhosts/system/logs/git/gitpull.log datestr=`date +%Y/%m/%d_%H:%M:%S` echo "$datestr git pull start." 1>>$LOG 2>&1 for (( i=0; i<${#DIR_ARR[@]}; i++ )) do target_dir=${DIR_ARR[$i]} branch=${BRANCH_ARR[$i]} # 反映先ディレクトリへ移動する cd "${DIR}/${target_dir}" echo "${DIR}/${target_dir}" 1>>$LOG 2>&1 # 反映したいブランチと現在のブランチが同じか確認する current=`git rev-parse --abbrev-ref HEAD` if [ "$current" != "$branch" ]; then # $BRANCHと異なる場合はcheckoutし直す `git checkout $BRANCH` 1>>$LOG 2>&1 fi # git fetch後、diffで差分があるか確認する fetch=`git fetch` diff=`git diff origin/$branch` # 更新処理を実施 if [ ${#diff} != 0 ] ; then # 差分がある場合は反映する `git reset --hard origin/$branch` 1>>$LOG 2>&1 echo "git reset --hard origin/${branch}" fi done # バッチ終了 datestr=`date +%Y/%m/%d_%H:%M:%S` echo "$datestr git pull finish." 1>>$LOG 2>&1 exit 0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/08/31 11:57

シングルクオートではなくバッククォートでやるか、コード部分を選択後に<code> をクリックね
退会済みユーザー

退会済みユーザー

2016/08/31 11:58

修正とすれ違った
guest

回答3

0

これを先のプロセスが終わってから次の処理が実行できるように変更したいのですが良くわからなくて誰かが教えていただきますか?

ロックで排他制御して、1個ずつしか処理しないようにする技法ということであれば、 flock コマンドで実装するのが良いかと思います。 flock コマンドで実装する場合の lock, unlock 関数の例を示します。

shell

1GIT_LOCK_FILE=/var/run/git.lock 2GIT_LOCK_TIMEOUT=600 3 4# prepare FD for lock. 5if ! exec {lockFd}>> $GIT_LOCK_FILE; then 6 echo "$datestr fail to open lock file($GIT_LOCK_FILE)." 1>>$LOG 2>&1 7 exit 1 8fi 9 10lock() { 11 if ! flock-w $GIT_LOCK_TIMEOUT $lockFd >/dev/null 2>&1; then 12 echo "$datestr fail to aquire lock, another git pull process may be running." 1>>$LOG 2>&1 13 return 1 14 fi 15 return 0 16} 17 18unlock() { 19 flock -u $lockFd 20}

flockコマンドでのロックの実装は、シェルスクリプトで旧来から常套手段とされているロックファイルの存在だけを確かめる方法と比べると、以下のメリットが有ります。

  • タイムアウト処理を実装してくれる(上記のコードで 10 分待ってロックが取れなければ諦めます)
  • ロックを保持しているプロセスが unlock を実行せずに異常終了してもロックが開放される

投稿2016/09/01 01:49

編集2016/09/01 01:52
mit0223

総合スコア3401

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hyskyo

2016/09/01 07:14

ありがとうございます!! 試させていただきます。
guest

0

この手の処理だったらうちの場合

  1. lock ファイルの有無を確認し存在しかつn分以内の場合処理を中断する。
  2. work ディレクトリに git pull を実効する。
  3. work ディレクトリと prod ディレクトリを rsync で反映する 。

投稿2016/08/31 12:51

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hyskyo

2016/09/01 07:15

ありがとうございます!! 試させていただきます。
guest

0

このGitバッチ処理がどうやって起動されているのか分かりませんが…

(1) 更新対象リスト(ファイル)を最新にメンテナンスする
(2) 上記リストから1件分を更新して、リストから消し込む

という処理をつくって cron から一定時間間隔で起動する
というのはどうでしょうか。
--- 追記 ---

//思いつきなので、細かいとこは自分でつめてくださいね。

# 更新処理を実施 if [ ${#diff} != 0 ] ; then # 差分がある場合は反映する #`git reset --hard origin/$branch` 1>>$LOG 2>&1 echo "git reset --hard origin/${branch}" >>hoge.txt fi

という感じで、まずは実行せずにリストの更新だけ実施。
それとは別のスクリプトで

exe=`head -1 hoge.txt` sed -e '1d' hoge.txt >tmp.txt $exe mv tmp.txt hoge.txt

という感じで実行。
hoge.txtの更新に矛盾がおきないように調査と実行の
タイミングを調整する必要があります。

投稿2016/08/31 12:10

編集2016/08/31 12:54
takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hyskyo

2016/08/31 12:19

ご指摘ありがとうございます。 一定時間間隔で処理する今よりは持ち時間長くはなりますが処理プロセスがたくさんたまって落ちたことがあります、なので何がいい方法あるかと思って質問させていただきました。 1, 2についてですが良く理解できませんでした、すみません少しわかりやすく説明していただきませんか? /etc/cron.d/gitpull にて # 月曜(1)〜日曜(7) 6時〜24時で設定しています。
hyskyo

2016/09/01 07:15

ありがとうございます!! 試させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問