回答:
ここで使用する正しいコマンドはunshare
です。これを行うために必要なオプションはからのみ利用可能であることに注意してくださいutil-linux 2.23
。アイデアは、実行中のプログラム用に新しいPID名前空間を作成し、そのすべての子もこの名前空間に作成されるようにすることです。以下を実行するだけで、新しいPID名前空間でコマンドを実行できます。
sudo unshare -fp some_command
シェルを実行するには、コマンドを省略します。これにより、子(子)とともに親(システム)名前空間内で通常どおりPIDを持つプロセスが作成されます。ただし、新しいネームスペース内1
では、init
プロセスの特別な特性のいくつかとともにPID があります。おそらく、監視の観点から最も関連する特性は、その子孫のいずれかが孤立している場合、実際のinit
プロセスではなく、このプロセスに再度親になることです。
ほとんどの場合、これを行うだけで十分です。前述のように、ネームスペース内のプロセスはすべて親ネームスペース内にPIDを持っているため、通常のコマンドを使用してアクティビティを監視できます。また、名前空間内のプロセスが孤立しても、最上位プログラムのPIDの下のプロセスツリーブランチから落ちないことを保証します。つまり、簡単に追跡できます。
ただし、実行できないと考えているPIDに関してプロセスを監視することはできません。これを行うには、特にps
新しいネームスペース内でコマンドを使用できるようにするにはprocfs
、ネームスペース用に別のファイルシステムをマウントする必要があります。これだけの場所から別の問題にターンリードでps
のために受け入れprocfs
IS /proc
。1つの解決策は、chroot
刑務所を作成し、procfs
そこに新しい刑務所を設置することです。しかし、これは面倒なアプローチです。少なくとも、使用する予定のバイナリを新しいルートに依存するライブラリと一緒にコピー(または少なくともハードリンク)する必要があります。
解決策は、新しいマウント名前空間も使用することです。この中でprocfs
、真のルート/proc
ディレクトリを使用し、PID名前空間内で使用でき、他の何にも干渉しない方法で新しいをマウントできます。このプロセスを非常に簡単にするために、unshare
コマンドは--mount-proc
オプションを提供します:
sudo unshare -fp --mount-proc some_command
ps
結合された名前空間内で実行すると、PIDネームスペースを持つプロセスのみが表示され、PIDがのトップレベルプロセスが表示され1
ます。
nsenter
?名前が示すように、nsenter
を使用して既に作成された名前空間を入力するために使用できますunshare
。これは、他の方法では無関係のスクリプトから名前空間内からのみ利用可能な情報を取得する場合に便利です。最も簡単な方法は、名前空間内で実行されているプログラムのPIDにアクセスすることです。明確にするために、これnsenter
は実行元のネームスペース内のターゲットプログラムのPIDである必要があります(ネームスペースはネストできるため、1つのプロセスに多くのPIDを持たせることができます)。ターゲットPID / mount名前空間でシェルを実行するには、次のようにします。
sudo nsenter -t $PID -m -p
この名前空間が上記のように設定されている場合、ps
その名前空間内のプロセスのみがリストされます。
init
スタイルプロセスが終了すると、それ以上作成できなくなるため、そのポイントは本当にわかりません。
man
自分自身への週末で、私はそれに少し慣れることを意味します。再度、感謝します。おそらく、--user
名前空間に関連性があります。