2011年3月27日日曜日

シンボリックリンクの張替え

PHP使ってると使用頻度の高いSmartyとかZendFrameworkとか。
多分に漏れず私もよくお世話になってますー。

大抵はどこか置き場所を決めて、'Smarty-2.6.26'の様にバージョン含んだディレクトリ名のまま集めといて、そのサーバで主に使うバージョンにはバージョン無しで(Smartyなら'Smarty'という名前で)シンボリックリンクを張って、シンボリックリンク経由で使うようにしている。

そんな運用方法をしていながらずっと悩んでたのが、既にあるシンボリックリンクを削除せずにリンク先を変更する方法。

だって、新しいバージョンに切り替える時とか、リンク先を変更したい事は結構多いけど、
普通にln -sしたって上手い事リンク先が上書きされるとか、そんな事にはならないし。
だからって一旦削除して作り直しをすると、
タイミング悪く削除して作られる前の瞬間にアクセスしてくる人が居ないとも限らないし・・・。
当然その時は「Smarty/libs/Smarty.class.phpなんてねーよ!」とかPHPがエラー吐くわけだし・・・。

って、ずっと思ってたんだけど、これでできた。
ln -snf リンク元 リンク名

地味に、すごく嬉しい。


# cd /usr/local/include/php/
# ls -l
合計 12
lrwxrwxrwx 1 root root   13  3月 26 15:40 Smarty -> Smarty-2.6.26
drwxrwxr-x 4 y__9 y__9 4096  6月 18  2009 Smarty-2.6.26
drwxr-xr-x 4 y__9 y__9 4096  2月 12 06:44 Smarty-3.0.7
lrwxrwxrwx 1 root root   28  3月 21 12:03 ZendFramework -> ZendFramework-1.11.4-minimal
drwxr-xr-x 4 y__9 y__9 4096  3月  3 04:31 ZendFramework-1.11.4-minimal
# ln -snf Smarty-3.0.7 Smarty
# ls -l
合計 12
lrwxrwxrwx 1 root root   12  3月 26 15:43 Smarty -> Smarty-3.0.7
drwxrwxr-x 4 y__9 y__9 4096  6月 18  2009 Smarty-2.6.26
drwxr-xr-x 4 y__9 y__9 4096  2月 12 06:44 Smarty-3.0.7
lrwxrwxrwx 1 root root   28  3月 21 12:03 ZendFramework -> ZendFramework-1.11.4-minimal
drwxr-xr-x 4 y__9 y__9 4096  3月  3 04:31 ZendFramework-1.11.4-minimal
#

ちなみに、各オプションの意味は↓。
-s, --symbolic
ハードリンクの代わりにシンボリックリンクを作成する。シンボリックリンクをサポートしないシステムでは、このオプションを指定すると単にエラーメッセージを出力する。
-n, --no-dereference
明示的にディレクトリにシンボリックリンクしているリンクファイルが指定された場合、それを普通のファイルと同じように扱う。 リンク先が実際のディレクトリ (どこかへのシンボリックリンクではない) の場合、そのディレクトリ内にリンクが作成される。しかしディレクトリへのシンボリックリンクがリンクフ ァイルとして指定された場合、 2つの可能性がある。 ln コマンドは指定されたリンクファイルを通常のディレクトリのように扱い、その中にリンクを作成することができる。もう 1 つは、リンクファイルが非ディレクトリ - シンボリックリンクそのものであるとして扱うことができる。その場合には、 ln コマンドは新しいリンクを作成する前にシンボリックリンクを削除、またはバックアップする必要がある。デフォルトでは、ディレクトリへのシンボリックリンクが指定された場合には、ディレクトリと同じように扱う。
-f, --force
指定したリンクファイルがすでにあった場合は削除する。

いっつもman lnしても英語だったからさ・・・(言い訳)