実行すると、ipcs -m
次のメッセージが表示されます。
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000 38699014 user 700 8125440 2 dest
0x00072 2064391 root 444 1 0
0x00000 38830088 user 700 299112 2 dest
0x00000 38862857 user 700 181720 2 dest
0x00000 38895626 user 700 244776 2 dest
0x00000 38928395 user 700 156816 2 dest
私が望むのは、これらの共有メモリを使用してプロセス(id)を取得することです。どうやって入手できますか?
答え1
ipcs -m -p
シュミッドを見せてそしてこれを生成したプロセスの PID("cpid")。
また、「最後の演算子」または「lpid」と表示されます。それが何であるかは全くわかりません(マンページにはこれについては記載されていないので、調べるにはドキュメントやソースコードを掘り下げる必要があります。これはクレイジーです。話しています!)。
たとえば、私のシステムの1つ(postgresやapacheなどを実行している場合)で、次のようにします。
$ ipcs -m -p
------ Shared Memory Creator/Last-op PIDs --------
shmid owner cpid lpid
36 postgres 3155864 2367086
38 root 14452 2362481
(apache、pid 14452は所有者のルートとして表示されます。ルートで始まりますが、www-data
他のプロセスを事前に分岐すると変更されます。)
これを使用して、コンストラクタawk
PIDを抽出し、xargs -n 1 pstree -p
そのPIDを表示するPIDツリーにリンクできます。
注:pstree
一度に最大1つのPIDパラメータしか使用できないため、xargs -n 1
各PIDに対して一度だけ実行する必要があります。pstree
pstree -A
たとえば、(ASCII出力の場合。そうでない場合は、端末で少しきれいに見えるデフォルトの線画文字を使用してください):-A
$ ipcs -m -p | awk '$3 ~ /^[0-9]+$/ {print $3}' | xargs -n 1 pstree -A -p
postgres(3155864)-+-postgres(1610942)
|-postgres(1620056)
|-postgres(1761109)
|-postgres(1831225)
|-postgres(1931537)
|-postgres(2123512)
|-postgres(2284745)
|-postgres(2386392)
|-postgres(3155867)
|-postgres(3155868)
|-postgres(3155869)
|-postgres(3155870)
|-postgres(3155871)
|-postgres(3155872)
`-postgres(3159321)
apache2(14452)-+-apache2(141263)
|-apache2(762459)
|-apache2(856005)
|-apache2(856006)
|-apache2(856008)
|-apache2(856009)
|-apache2(856010)
|-apache2(856438)
|-apache2(1369957)
|-apache2(1777646)
|-apache2(1887781)
`-apache2(3746760)
必要に応じて、後処理(awkまたは他のツールを使用)して角かっこ内からPIDのみを抽出できます。
ちなみに、出力内容と形式を変更するために使用できるpstree
さまざまな便利なオプション(-u
show uid変換と完全なコマンドライン表示を含む)があります。-a
cpid と lpid の pstree を表示する必要がある場合は、以下を使用します。
$ ipcs -m -p | awk '$3 ~ /^[0-9]+$/ {printf "%s\n%s\n", $3, $4}' | xargs -n 1 pstree -p