Ostatnio kopałem informacje o procesach w GNU / Linux i spotkałem niesławną bombę widelcową:
:(){ : | :& }; :
Teoretycznie ma się powielać w nieskończoność, dopóki systemowi nie zabraknie zasobów ...
Jednak próbowałem przetestować zarówno Debian CLI, jak i dystrybucję GUI Mint i wydaje się, że nie ma to większego wpływu na system. Tak, powstaje mnóstwo procesów, a po chwili czytam w komunikatach konsoli, takich jak:
bash: fork: zasób tymczasowo niedostępny
bash: fork: retry: Brak procesów potomnych
Ale po pewnym czasie wszystkie procesy po prostu giną i wszystko wraca do normy. Czytałem, że ulimit ustawił maksymalną liczbę procesów na użytkownika, ale nie wydaje mi się, żeby być w stanie podnieść go naprawdę daleko.
Jakie są zabezpieczenia systemu przed bombą widełkową? Dlaczego się nie powiela, dopóki wszystko się nie zawiesi lub przynajmniej nie zostanie zbyt długo opóźnione? Czy istnieje sposób na naprawdę rozbicie systemu za pomocą bomby widelcowej?
:(){ :& :; }; :
zamiast tego pobiegniesz ? Czy oni też ostatecznie zostaną zabici? Co:(){ while :& do :& done; }; :
?Odpowiedzi:
Prawdopodobnie masz dystrybucję Linuksa, która używa systemd.
Systemd tworzy grupę cgroup dla każdego użytkownika, a wszystkie procesy użytkownika należą do tej samej grupy cgroup.
Cgroups to mechanizm Linuksa służący do ustawiania limitów zasobów systemowych, takich jak maksymalna liczba procesów, cykli procesora, użycia pamięci RAM itp. Jest to inna, bardziej nowoczesna, warstwa ograniczająca zasoby niż
ulimit
(która korzysta zgetrlimit()
syscall).Jeśli uruchomisz
systemctl status user-<uid>.slice
(która reprezentuje grupę użytkownika), możesz zobaczyć bieżącą i maksymalną liczbę zadań (procesów i wątków), które są dozwolone w tej grupie.Domyślnie maksymalna liczba zadań, które systemd pozwoli na każdego użytkownika, wynosi 33% „maksimum ogólnosystemowego” (
sysctl kernel.threads-max
); zwykle wynosi to około 10 000 zadań. Jeśli chcesz zmienić ten limit:W systemd v239 i nowszych, domyślna wartość użytkownika jest ustawiona poprzez TasksMax = w
Aby dostosować limit dla konkretnego użytkownika (który zostanie zastosowany natychmiast, a także zapisany w /etc/systemd/system.control), uruchom:
systemctl edit
Można tu również użyć zwykłych mechanizmów zastępowania ustawień jednostki (takich jak ), ale będą one wymagały ponownego uruchomienia. Na przykład, jeśli chcesz zmienić limit dla każdego użytkownika, możesz utworzyć/etc/systemd/system/user-.slice.d/15-limits.conf
.W wersji systemowej v238 i wcześniejszych domyślną wartością użytkownika jest UserTasksMax = in
/etc/systemd/logind.conf
. Zmiana wartości zazwyczaj wymaga ponownego uruchomienia.Więcej informacji na ten temat:
źródło
To i tak nie spowoduje awarii nowoczesnych systemów Linux.
Tworzy mnóstwo procesów, ale tak naprawdę nie spala tyle procesora, gdy procesy stają się bezczynne. Skończyło Ci się miejsce w tabeli procesów, zanim zabraknie pamięci RAM.
Jeśli nie jesteś ograniczony do grupy, jak wskazuje Hkoof, następująca zmiana nadal obniża systemy:
źródło
fork
w kółko), a resztę czasu wykonuje na wywołaniu funkcji (przyrostowo zużywa więcej pamięci dla każdego wywołania w stosie wywołań powłoki, prawdopodobnie).:(){ :& :; }; :
:) zamiast tej w pytaniu. Właściwie nie do końca przemyślałem przepływ egzekucji tego archetypowego.W latach 90. przypadkowo uwolniłem jeden z nich na siebie. Nieumyślnie ustawiłem bit wykonania w pliku źródłowym C, który zawierał polecenie fork (). Kiedy go dwukrotnie kliknąłem, csh próbował uruchomić go, a nie otworzyć w edytorze takim, jak chciałem.
Nawet wtedy nie spowodował awarii systemu. Unix jest na tyle solidny, że twoje konto i / lub system operacyjny będą miały limit procesów. Zamiast tego robi się bardzo powolny i wszystko, co musi rozpocząć proces, może zawieść.
Za kulisami tabela procesów zapełnia się procesami, które próbują utworzyć nowe procesy. Jeśli jeden z nich zakończy działanie (albo z powodu błędu na rozwidleniu, ponieważ tabela procesów jest pełna, albo z powodu desperackiego operatora próbującego przywrócić zdrowie psychiczne do swojego systemu), jeden z pozostałych procesów wesoło rozwiąże nowy do wypełnienia pustka.
„Bomba widełkowa” jest zasadniczo niezamierzonym samonaprawiającym się systemem procesów mających na celu utrzymanie pełnego stołu roboczego. Jedynym sposobem na powstrzymanie tego jest jakoś ich wszystkich zabić naraz.
źródło
-1
nie jest flagą.kill
bierze tylko jedną opcję, a następnie zatrzymuje opcje analizy. To zabija identyfikator procesu-1
, który jest aliasem dla wszystkich procesów.