簡単なコマンドの組み合わせで大きな仕事も容易に片付けることができる。今回作成するのは、Samba共有ファイルを使用中のマシンを見つけるスクリプトだ。
Linuxユーティリティを組み合わせて使えば、ネットワーク上の誰がどの共有ファイルシステムを利用しているかがいつでも分かるので、システムのアップデート時には彼らにログオフを依頼できる。
わたしの顧客の1人は、Visual Basic 6およびAccessベースの数多くの小型アプリケーションを直接Linux上で稼働させて、Sambaによるネットワーク共有を介して各Windows XPクライアントから利用できるようにしている。だが、そうしたアプリケーションやデータベースのアップデートが必要になるたびに、彼は新しいバイナリや Accessファイルをサーバにアップロードできるようにそのアプリケーションからのログオフをユーザーに依頼することになる。しかし、彼の管理する中規模ネットワークにはそうしたアプリケーションを使用しているクライアントが100台ほど存在するため、例えログオンしているのが1人だけでも、そのアプリケーションを使用中のユーザーが見つかるまで延々と電話をかけ続け、見つかったユーザーにログオフを依頼して、アップロードを実行しなければならない。
今回、この問題をlsof、netstat、gawk、grep、uniqをはじめとするユーティリティの組み合わせによって解決するスクリプトを作成した。アプリケーションのバイナリはすべて、/usr/appsの下にある、payroll、accounting、sales、invoiceといったサブフォルダに格納されている。例えば、先ほどの顧客が給与台帳(payroll)システムを使用中のすべてのユーザーを知る必要があるなら、以下に示すように、開かれている全ファイルを表示してくれるlsofユーティリティが利用できる。
lsof | grep /usr/apps/payroll
smbd 16258 systems cwd DIR 8,5 4096 2191586 /usr/apps/payroll
smbd 16258 systems 27rR REG 8,5 2449408 2191760 /usr/apps/payroll/payroll.exe
smbd 16258 systems 28u REG 8,5 37883904 1684790 /usr/apps/payroll/dbpayroll.mdb
smbd 16258 systems 29uw REG 8,5 256 1684290 /usr/apps/payroll/dbpayroll.ldb
smbd 19237 systems cwd DIR 8,5 4096 2191586 /usr/apps/payroll
smbd 19237 systems 25rR REG 8,5 2449408 2191760 /usr/apps/payroll/payroll.exe
smbd 19237 systems 27u REG 8,5 37883904 1684790 /usr/apps/payroll/dbpayroll.mdb
smbd 19237 systems 28uw REG 8,5 256 1684290 /usr/apps/payroll/dbpayroll.ldb
smbd 19237 systems 29rW REG 8,5 45056 1684863 /usr/apps/payroll/report1.rpt
この出力のプロセスID(PID)が16528から19237までの部分は、smbd(Samba)によって複数のファイルが開かれていることを示している。例えば、2人のユーザーがpayroll.exeアプリケーションを使用中であることが分かる。また、最後の行は、 report1.rptファイルが使用中であることを示している。これは標準的なCrystal Reportの拡張子であり、このアプリケーションもビジー状態であることが分かる。しかし、こちらはユーザー名が分からないので、以下のようにして先ほどの出力結果から必須の情報(PID番号)だけを抽出する必要がある。
lsof | grep /usr/apps/payroll | gawk '{ print $2 }'
16258
16258
16258
16258
19237
19237
19237
19237
19237
このようにgawkを使えば2番目のフィールドだけを抜き出せるが、重複するものは必要ない。そういうときは、ソートされた一覧から重複する行を削除してくれるuniqを使えばよい。
lsof | grep /usr/apps/payroll | gawk '{ print $2 }' | uniq
16258
19237
この結果をテンポラリ(tmp)ファイルに残すには、次のようにする。
lsof | grep /usr/apps/payroll | gawk '{ print $2 }' | uniq > tmp
Copyright © 2010 OSDN Corporation, All Rights Reserved.