unoh.github.com

Windowsユーザに贈るUNIXトリビア

2006-04-20 07:12:31 +0000

こんにちは、尾藤正人です。

僕は昔からLinux(UNIX)が好きで、今でもメインに使っている OS は Linux です。
クライアント OS は Windows ですが、かならずローカルに Linux 環境を構築します。
使い慣れたコマンドラインツールの威力を味わってしまうと、もう離れられません。

前職では Linux のパッケージソフトウェアを開発していたので、周りの技術者もガリガリ Linux を使いこなせていたのですが、ウノウはサービスよりな企業ということもあるせいか、一緒に働くエンジニアに Windows をメインに使っている人が増えてきました。
世の中一般的にはこれが普通なんだろうなぁと思いつつ、少しずつ Linux の便利さを教えて洗脳する日々を送っています。

たぶんここで「じゃあ今日はこれが便利なので紹介します」という展開になるのだろうけど、それだけじゃ全然面白くないので、今日は知ってても大したメリットないけど普通は知らないような UNIX系OS のトリビアを紹介します。

kill コマンドはプロセスを殺す(kill)ためのコマンドではない



kill なんていう恐ろしい名前のついたコマンドですが、実際はプロセスにシグナルを送るだけのコマンドです。

UNIX でシグナルの種類はいろいろあって(man 7 signal で一覧がみれます)、kill コマンドでシグナルの種類を指定しなかった場合はデフォルトで SIGTERM が送信されます。
SIGTERM はプロセスを terminate(終了) させるためのシグナルになってて、kill コマンドで引数を指定しなかった場合はプロセスが終了するようになっているわけです。

たまに kill で終了しないプロセスがありますが、そいうプログラムは SIGTERM を無視する、あるいは処理が終了しないようなシグナルハンドラを登録しています。
例えば SIGTERM を無視するには次のように書きます。

signal(SIGTERM, SIG_IGN);


これをプログラムのどこかに書いておけば、普通に kill してもプロセスは終了しなくなります。

プロセスを強制的に終了させるには kill -KILL します。
この場合は SIGKILL というシグナルが送信されて、プログラムからはその挙動を変更できないようになってて、プロセスが強制終了させられます。

他に覚えておきたいシグナルは SIGHUP です。デーモンに設定ファイルの更新や、ログファイルに変更があったときに知らせるためによく使われるシグナルです。

rm コマンドはファイルを削除(remove)するためのコマンドではない



rm は ReMove の略なんだからファイルを削除するに決まってるだろうと思うんですが、実はそうではない。
正確にはファイルへのリンクを削除する(unlink)ためのコマンドです。
ファイルを削除するのはカーネルの仕事になります。

UNIX を使ってて起きるトラブルの1つに、ログファイルが大きくなったので rm で削除したんだけど df してみると全然ファイルサイズが減ってない、というのがあります。
これは rm がファイルを削除してないゆえんで、rm はファイルへのリンクは削除したんだけどデーモンプロセスがログファイルをオープンしたままになっててファイルシステム上では見えてないんだけど、ファイルは実際に存在しているという状態になっています。
こういう時に前述した SIGHUP を送ってデーモンに気づかせるわけです。



Windowsユーザに送るUNIXトリビアいかがでしたでしょうか。
少しは UNIX の事を好きになってもらえたでしょうか。(えっ、逆だって?)



最後に知ってても全く役立たない問題を

Q. /bin/sh(シェル) だけで次のこと行ってみよ




もしシステムがどうしようもない状態になって /bin/sh しか使えなくなったときに覚えておくときっと役に立ちます!!
そういう状態ってよくありますよね!? そうですよね!?