Developer's Blog

Git の hook でパーミッション関係

こんにちはこんにちは! エンジニア川端です。
とつぜん寒くなりましたね。シャツ一枚だと通勤時の視線が痛い、そんな季節が近づいてきました。
寒さが苦手な私は、日に日に動きがにぶくなっています。

そんな担当者と違い、暑かろうが寒かろうがサーバは 24 時間フル稼働です。
今日は、表題の件をふくめ、大ハマリではないけど最初からちゃんとしてればよかった (つまり自分が悪い)、小ハマリ話をお届けします。

Git の hook で umask

最近は「git push して WEB サイト更新」というような記事をあちこちで見るようになりました。
私も個人利用のサーバに git と gitolite を導入して、 hooks/post-update で

cd /var/www/html/hogehoge
git --git-dir=.git pull

とかやってますが、最初、ファイルのパーミッションの問題で小ハマリしました。
WEB 公開するコンテンツはパーミッションを 0644 にしたかったのですが、0600 になってしまいます。

解決策 1

post-update の中で

umask 0022

して解決しました。でも釈然としない。なんで umask 0077 になっているのか。

解決策 2

で、もっとよく見ていくと、~/.gitolite.rc の中で UMASK が定義されていたので、そこを変更したら post-update で何もしなくてもよくなりました。
全部同じでいいなら、ここでやってしまえばよさそう。

解決策 3

gitolite を使わない場合はどうなるか、そのうち検証しようと思います。

教訓

あちこちのサイトでいろんなことの簡単な手順が公開されていますので、ついお手軽にやってしまいがちですが、基本はドキュメント & ソースコード。

余談ですが、.git は WEB サーバの設定で見れなくしておく方がよいですね。
あと、gitolite は Perl で作られたツールです。git LOVER サンは Perl をディスるの禁止。

いつのまにかディスク容量が……

某格安 VPS サーバから「ディスク容量やばす」メールが届きました。まだまだ余裕があるはずなんだが、と確認してみたところ……

サーバ 1 = 某プラン (旧)
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda2              17G   11G  5.0G  69% /            <= 
/dev/hdb1              99G  3.5G   91G   4% /home        <= 
tmpfs                 2.0G     0  2.0G   0% /dev/shm
/dev/hda1              99M   18M   76M  19% /boot

サーバ 2 = 某プラン (現)
Filesystem            Size  Used Avail Use% Mounted on
/dev/vda3             392G  5.5G  367G   2% /            <=
tmpfs                 1.9G     0  1.9G   0% /dev/shm
/dev/vda1             243M   71M  160M  31% /boot

警告が出たのは、サーバ 1 = 某プラン (旧) の方です。
プラン名自体は変わらないのですが、旧プランの時は、/ 以下のディスク容量は少なく、/home に大きいディスクがマウントされています。油断して現環境と同じように使ってたら、/var/log/ が大変なことに!

最近、自分で作る時は /boot 以外全部 / にしてしまうことが多かったので、あまり気にしていませんでした。反省。

教訓

サーバも人間もいっしょ。一人一人の個性を意識して大切に。

Linux で自動復元圧縮ファイル

最後は「ネタ、もう 1 つくらい欲しいな」と無理矢理でっちあげようとしてハマったネタを。
使うあてもないんですが、自動解凍(復元) 形式の .tar.gz ファイルを作っていて、小ハマリしました。

サンプル

base.sh

#!/bin/bash

LINE=`expr $(wc -l < $0) - 5`;
tail -n $LINE $0 | tar zxfvp -
exit;

最後に空行をいれるのを忘れないでください (後ほど目視でわかりやすいよう、わざと空行いれてます)。

次に、元となる .tar.gz ファイルを用意して、base.sh と連結します。

cat base.sh hoge.tar.gz > selfextract.sh

中をのぞいてみましょう。

selfextract.sh

#!/bin/bash

LINE=`expr $(wc -l < $0) - 5`;
tail -n $LINE $0 | tar zxfvp -
exit;

a?O???
?0?q??
?M?q=
     ?EBPJ????@?"??}??^??<???V봫??"S}?RZm?T:?2??LR??N??=?ruOwr??[???s?}?u'|?є?????=?R
                                                                                     ??i??6:IEĞF???????}`???????濴??7?2????߻???Г???????6u????
             ???(

selfextract.sh を実行すると、.tar.gz ファイルが展開されます。

解説

selfextract.sh は

  1. 自分自身の行数を数えて
  2. base.sh の行数を差し引いて tail して、tar.gz 部分を取り出して、
  3. tar に渡して復元する

という感じで実行されます。

ポイントは、base.sh は 6 行なのに、引き算では -5 していることろ。
これは、wc でカウントする時に 1 行少なくカウントされてしまうからです。
.tar.gz ファイルの最後に改行が含まれていませんので、wc で行数を数えると 1 行少なくカウントされます。
一方 tail は、最終行に改行コードが含まれていなくても 1 行です。この改行 1 つ分の差を調整しているわけです。

教訓

用のないものは作らない。

……というような他愛ないことを日々一緒に語り合えるステキエンジニア募集中です。
こぞってご応募ください!

ひとつひとつは小さなことでも積み重ねるとけっこうなボリュームになるので、こういう小ハマリを減らして、エンジニア力を高めていきたいものです。
皆様も、小さな無理を積み重ねて風邪などひかれませぬよう、ご自愛ください。特に心の風邪は長引きますので、お気をつけくださいね。


Copyright © 2019 Fenrir Inc. All rights reserved.