Subject: How do I find the process ID of a program with a particular name ... ?
Date: Thu Mar 18 17:16:55 EST 1993

3.10) シェルスクリプトや C プログラムの中で、プロセスの名前から プロセスID を調べるには。

シェルスクリプトの場合:
プログラム名とプロセス ID との間をマッピングするように特別に設計された ユーティリティーはありません。さらに、そのようなマッピングはしばしば当 てになりません。というのは、一つ以上のプロセスが同じ名前を持ち得るし、 プロセスは、それが走りだしてから名前を変えることが可能だからです。しか し、以下のようなパイプラインを、(あなたが所有している) ある名前のプロセ スのリストを得るために使えます:
ps ux | awk '/name/ && !/awk/ {print $2}'
`name' を捜しているプロセスの名前に置き換えましょう。

一般的な考えかたは、ps の出力をある名前を含む行を捜しだすために awk, grep その他のユーティリティーを使って解析して、そしてその行にある PID をプリントアウトすることです。上記の場合 `!/awk/' がるため awk プロセス 自身は表示されないことに注意してください。

あなたがどんな UNIX を使っているかで、あなたは ps の引数を変えなければ ならいでしょう。

C のプログラムでは:
プログラム名と、プロセス ID をマッピングするように設計されたユーティリ ティーが無いように、(移植性のある) C ライブラリ関数もありません。

しかしいくらかのベンダーは、カーネルメモリを読むための関数を提供してい ます。例えば Sun は `kvm_' 関数を、データゼネラルは `dg_' 関数を提供し ています。これらの関数は、どのユーザも使用可能かもしれませんが、システ ムのカーネルメモリのリードアクセスが限定されているの場合は、スーパー ユーザ(あるいは 'kmem' グループに属するユーザ)のみしか利用できません。 その上、これらの関数は文書化されていないか、ひどい文書になっており、さ らにリリース毎に改訂されてしまうこともしばしばあります。

いくつかのベンダーは、ディレクトリとその中のファイルとして表された `/proc' ファイルシステムを提供しています。各々のファイル名はプロセスID に対応した数字になっていて、プロセスについての情報を得るためにファイル をオープンし、それを読むことができます。しかし、またアクセスが限定され るかもしれなし、インターフェイスがシステム毎に変わるかもしれません。

ベンダーが準備したライブラリ関数を使うことができず、'/proc' も無く、そ れでもまだ完全に C の中でこれを行いたいと思っているのなら、あなた自身 で、カーネルメモリの中を探検しなければならないでしょう。たくさんのシス テム上で実現された、これを行なう方法の良い例として、comp.sources.unix アーカイブで利用可能な `ofiles' のソースを参照して下さい(カーネルを探検 する助けになる `kstuff' と名付けられたパッケージが 1991年5月に alt.sources にポストされ、さらに anonymous ftp でも wuarchive.wustl.eduの usenet/alt.sources/articles/ {329{6,7,8,9},330{0,1}}.Z が利用可能です)。


UNIX FAQ LIST / Copyright(c)1994,Ted Timar / tmatimar@isgtec.com


Maintainer: あさだ たくや