Samba共有ファイルを使用中のマシンが分かるスクリプトLeverage OSS(1/2 ページ)

簡単なコマンドの組み合わせで大きな仕事も容易に片付けることができる。今回作成するのは、Samba共有ファイルを使用中のマシンを見つけるスクリプトだ。

» 2007年10月15日 10時52分 公開
[Sergio-Gonzalez-Duran,Open Tech Press]
SourceForge.JP Magazine

 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

関連キーワード

Leverage OSS | Samba | コマンドライン | 便利


       1|2 次のページへ

Copyright © 2010 OSDN Corporation, All Rights Reserved.

注目のテーマ