unshare殺人作業を安定的にするパッチ

unshare殺人作業を安定的にするパッチ

~からこの回答私たちは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からwatchPID 1(私のUbuntuでシステム化)にリセットするので、すべての子供を殺すことは望ましくありません。

質問:

  • --fork望ましい効果を達成することがなぜ必要なのか?フォークをunshare使うだけでexec()は十分ではないのはなぜですか?
  • 解決策はありますか?私はその下のすべてを殺し始め、生成されたkill -9PIDに簡単に送信できるようにしたいです。unshareしかし、killを使用すると--fork、起動時に返されたpidは私のPID名前空間にないため、unshare単に終了してunsharePID bash1にリセットされます。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"

関連情報