フォーク爆弾でシステムを衝突できないのはなぜですか?

フォーク爆弾でシステムを衝突できないのはなぜですか?

私は最近、GNU / Linuxプロセスに関する情報を検索し、悪名高いフォーク爆弾を発見しました。

:(){ : | :& }; :

理論的には、システムリソースが不足するまで無限に自分自身をコピーする必要があります。

しかし、私は試しましたコマンドラインインタフェースそしてシナモンミントdistroではシステムにほとんど影響を与えないようです。はい、多くのプロセスが作成され、しばらくすると、次のコンソールメッセージが読み込まれました。

bash:フォーク:リソースを一時的に使用できません。

bash:フォーク:再試行:子プロセスなし

しかし、一定時間が経過すると、すべてのプロセスが終了し、すべてが正常に戻ります。私が読んで限界値ユーザーあたりの最大プロセス数を設定しますが、あまり増やすことはできないようです。

フォーク爆弾に対するシステム保護措置は何ですか?すべてが停止するか、少なくとも遅れるまで自己複製されないのはなぜですか?実際にフォーク爆弾でシステムを衝突させる方法はありますか?

ベストアンサー1

おそらくsystemdを使用するLinuxディストリビューションがあります。

Systemd はユーザーごとに cgroup を作成し、ユーザーのすべてのプロセスは同じ cgroup に属します。

Cgroupは、最大プロセス数、CPUサイクル、RAM使用量などのシステムリソース制限を設定するためのLinuxメカニズムです。これは、システムコールをulimit使用するのとはgetrlimit()異なり、より近代的なリソース制限層です。

systemctl status user-<uid>.slice(ユーザーのcgroupの代わりに)実行すると、現在および最大数を表示できます。仕事この cgroup に許可されるプロセスとスレッドです。

$systemctl 状態 user-$UID.slice
● user-22001.slice - UID 22001 のユーザーフラグメント
   ロード済み:ロード済み
  挿入:/usr/lib/systemd/system/user-.slice.d
           └─10-defaults.conf
   アクティブ:2018-09-10 17:36:35 EDT 1週3日前の月曜日からアクティブです。
    ミッション:17(制限:10267)
   メモリ:616.7M

デフォルトでは、systemdはユーザーごとの最大ジョブ数を「システム全体の最大ジョブ数」()の33%として受け入れます。sysctl kernel.threads-maxこれは通常約10,000の作業に対応します。この制限を変更するには:

  • systemd v239以降では、ユーザー設定は次のように行われます。最大ジョブ数=存在する:

    /usr/lib/systemd/system/user-.slice.d/10-defaults.conf
    

    特定のユーザーの制限を調整するには(すぐに適用され、/etc/systemd/system.controlに保存されます)、次のように実行します。

    systemctl [--runtime] set-property user-<uid>.slice TasksMax=<value>
    

    デバイス設定を上書きする一般的なメカニズム(例systemctl edit:)もここで使用できますが、再起動が必要です。たとえば、次の制限を変更したい場合すべて作成できる/etc/systemd/system/user-.slice.d/15-limits.confユーザー

  • systemd v238以前では、ユーザーのデフォルト設定は次のようになります。ユーザー操作の最大値=存在する/etc/systemd/logind.conf。この値を変更するには通常、再起動が必要です。

これに関する追加情報:

おすすめ記事