~からこの回答私たちはLinux PID名前空間を介してプロセス全体のサブツリーを確実にシャットダウンできることを学びましたunshare -p
。
私が理解していない問題は次のとおりです。
-f
--fork
/オプションを使用して共有をキャンセルした場合にのみ機能します。unshare -fp -- bash -c "watch /bin/sleep 10000 && echo hi"
これを実行すると、
kill -9
そのPIDがbash
必要に応じて監視、スリープなどがすべて終了します。しかし、私がそれを使用したときに何も
-f
:unshare -p -- bash -c "watch /bin/sleep 10000 && echo hi"
PIDをbashして
kill -9
からwatch
PID 1(私のUbuntuでシステム化)にリセットするので、すべての子供を殺すことは望ましくありません。
質問:
--fork
望ましい効果を達成することがなぜ必要なのか?フォークをunshare
使うだけでexec()
は十分ではないのはなぜですか?- 解決策はありますか?私はその下のすべてを殺し始め、生成された
kill -9
PIDに簡単に送信できるようにしたいです。unshare
しかし、killを使用すると--fork
、起動時に返されたpidは私のPID名前空間にないため、unshare
単に終了してunshare
PIDbash
1にリセットされます。unshare
&& echo hi
コマンドを実行するとこれがbash -c
実行されるため、exec()
bashプロセスが消え(置き換えられ)、そのPIDを削除できないため、これが必要です。
答え1
上記のようにこの有用な答えから-n
()の効果はunshare(CLONE_NEWPID)
フォークの最初のサブプロセスにのみ影響します。
特に、男2共有解除もちろんCLONE_NEWPID
:
呼び出しプロセスが既存のプロセスと共有されていない子プロセスの新しいPID名前空間を持つように、PID名前空間共有を解放します。
呼び出しプロセスは新しい名前空間に移動されません。
呼び出しプロセスによって生成された最初の子プロセス
init(1)
プロセスID 1を持ち、新しい名前空間で役割を引き受けます。
unshare
殺人作業を安定的にするパッチ
私の質問を受けた後、ここ数時間私はパッチを書きましたutil-linux
(ここからリクエストを引き出す)に--kill-child
フラグを追加しますunshare
。
編集する:これでutil-linuxの一部としてマージされ、リリースされましたv2.32
。
次のように使用できます。
unshare -fp --kill-child -- bash -c "watch /bin/sleep 10000 && echo hi"
終了すると、unshare
期待どおりにプロセスツリー全体が破れます。
いいえroot
root
カーネルにCONFIG_USER_NS=y
フラグを渡してユーザーの名前空間を有効にした場合は、許可なく使用することもできます-U
。
unshare -Ufp --kill-child -- bash -c "watch /bin/sleep 10000 && echo hi"