コマンド名偽装Perl先日、moznion氏の「実行中のプログラムの進捗度を手っ取り早く確認したい」という面白い記事を読みました。語ったところ地味にウケが良かったので、さらに調子に乗って、細かすぎて伝わらないPerlと$0の関係について語ります。本稿の実用性はあまりありませんが、ちょっとだけあります。上述のmoznion氏のブログは、Rubyで$0をいじるとpsコマンドで見えるコマンド名が変わって便利、という話でした(「アッアッ」)。Perlでも同様に、$0をいじることでpsコマンドで見えるCOMMAND値を変えることができます(なお時折勘違いする人がいますが、元のファイル名は変わりません。psコマンドで見える値だけです)。これはOSによって結構動作が違うので、以下しばらくLinux(CentOS)限定の話をします。[スクリプトファイル名]」の形で見えます。~]$ではここで、次のようにPerlスクリプト内で、$0に"notepad.exe"という値を代入してみましょう。100;この状態で別端末からpsコマンドを実行すると、まるでnotepad.exeを実行しているように見えます。psコマンドの実装なぜこんなことが起こるかを理解するには、Linuxのpsコマンドの実装を知る必要があります。Linux(CentOS)では、psコマンドはprocpsというパッケージに入っています。/bin/psprocps-3.2.8-25.el6.x86_64procpsの公式ページからpsコマンドのソースコードを見てみると、これは内部で/proc配下のファイルを読んでいるようです。ソースコード読むのメンドクセーという人は、straceを付けてpsコマンドを実行してみればすぐ分かります。0....(省略)....このように、psコマンドでは/proc/(プロセスID)/cmdlineというprocファイルから、表示するCOMMAND名を取得しています。実際、Perlスクリプト中で$0を書き換えると、その時点でcmdlineファイルの内容が書き換わることが分かります(ので、各自やってみてください)。procファイルにはもう一つ、commというファイルがあります。こちらは$0を書き換えても変わりません(ので、これも各自やってみてください)。