私は最近、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
。この値を変更するには通常、再起動が必要です。
これに関する追加情報: