Neden sistemimi çatal bomba ile çökertemiyorum?


54

Son zamanlarda GNU / Linux'taki işlemler hakkındaki bilgileri araştırıyorum ve ünlü çatal bombalarıyla tanıştım:

:(){ : | :& }; :

Teorik olarak, sistemin kaynakları tükenene kadar sınırsızca çoğaltılması gerekiyordu ...

Bununla birlikte, hem bir CLI Debian hem de bir GUI Mint dağıtımı üzerinde test etmeyi denedim ve sistemi pek etkilemiyor. Evet, oluşturulan birçok işlem var ve bir süre sonra aşağıdaki gibi konsol mesajlarını okudum:

bash: fork: Kaynak geçici olarak kullanılamıyor

bash: çatal: yeniden dene: Çocuk işlem yok

Fakat bir süre sonra, tüm süreçler daha yeni öldürülür ve her şey normale döner. Ulimit'in kullanıcı başına maksimum miktarda işlem koyduğunu okudum , ancak gerçekten çok fazla kaldıramayacağımı düşünüyorum.

Çatal bombalarına karşı sistem korumaları nelerdir? Neden her şey donuncaya kadar ya da en azından çok fazla kaynayana kadar kendini kopyalamıyor? Çatal bombalı bir sistemi gerçekten çökertmenin bir yolu var mı?


2
Maksimum PID’niz şu anda ne için ayarlanmış?
dsstorefile1

5
Dediğin gibi “çarpışma” çatal bomba kullanarak sistem ..., sen kaynakları tüketmesine edeceğiz unutmayın ve yeni süreçler yumurtlamaya mümkün olmayacaktır ancak sistem olmamalı çökmesine
Josh

2
Onun :(){ :& :; }; :yerine koşarsan ne olur ? Sonunda hepsi de sonunda öldürülüyor mu? Ne hakkında :(){ while :& do :& done; }; :?
mtraceur

Bu harika sorunuz, önceki "kapalı izin" oyumu yeniden düşünmem için beni ikna etti. Ancak, "Ben" her zaman İngilizce olarak büyük harftir, lütfen daha fazla kötü yazmayın.
kullanıcı259412

Yanıtlar:


85

Muhtemelen systemd kullanan bir Linux dağıtımınız vardır.

Systemd, her kullanıcı için bir grup oluşturur ve bir kullanıcının tüm işlemleri aynı gruba aittir.

Cgroups Bu daha sınırlayıcı kaynağın farklı, daha modern, tabaka vb işlemlerin maksimum sayıda işlemci çevrimleri, RAM kullanımı gibi sistem kaynaklarını sınırlarını belirlemek için bir Linux mekanizmadır ulimit(kullanan getrlimit()çağrısını).

Çalıştırırsanız systemctl status user-<uid>.slice(kullanıcının grubunu temsil eder), o grup içinde izin verilen geçerli ve maksimum görev sayısını (işlemler ve iş parçacıkları) görebilirsiniz.

$ systemctl status user- $ UID.slice
● user-22001.slice - UID 22001 Kullanıcı Dilimi
   Yüklendi: yüklendi
  Ekstra: /usr/lib/systemd/system/user-.slice.d
           └─10-defaults.conf
   Aktif: Pzt 2018-09-10 17:36:35 tarihinden beri aktif EEST; 1 hafta 3 gün önce
    Görevler: 17 (sınır: 10267)
   Bellek: 616.7M

Varsayılan olarak, her kullanıcı için sistemde izin verilen maksimum görev sayısı "sistem genelindeki maksimum" ( sysctl kernel.threads-max) değerin% 33'üdür ; bu genellikle ~ 10.000 görev anlamına gelir. Bu limiti değiştirmek istiyorsanız:

  • V239 ve sonraki sistemlerde kullanıcı varsayılanı TasksMax = in ile ayarlanır .

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

    Belirli bir kullanıcının sınırını ayarlamak için (hemen /etc/systemd/system.control'de depolananların yanı sıra hemen uygulanacak olan), aşağıdakileri çalıştırın:

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

    Birimin ayarlarını (örneğin systemctl edit) geçersiz kılma alışılmış mekanizmaları burada da kullanılabilir, ancak yeniden başlatılması gerekir. Örneğin, her kullanıcı için limiti değiştirmek istiyorsanız, oluşturabilirsiniz /etc/systemd/system/user-.slice.d/15-limits.conf.

  • Systemd v238 ve önceki sürümlerde, kullanıcı varsayılanı UserTasksMax = in aracılığıyla ayarlanır /etc/systemd/logind.conf. Değeri değiştirmek genellikle yeniden başlatma gerektirir.

Bu konuda daha fazla bilgi:


5
Ve 12288 süreci (eksi bombadan önce doğmuş olan şey) yenisini yaratmaya çalışmaktan başka bir şey yapmamak , modern bir sistemi etkilemiyor.
Direk

13

Bu artık modern Linux sistemlerini çökertmeyecek.

Süreçlerin birikintileri yaratır ancak süreçler boşa giderken bu kadar fazla CPU yakmaz. Artık RAM'de bitmeden işlem tablosundaki yuvaların tükenmesi.

Eğer Hkoof'un işaret ettiği gibi sınırlı bir grup yoksa, aşağıdaki değişiklik hala sistemleri yıkar:

:(){ : | :& : | :& }; :

5
Bu gerçekten sistemi 'çökertmeyi' düşündüğünüze bağlıdır. İşlem tablosundaki yuvaların tükenmesi, çoğu durumda bir çekirdek panikine yol açmasa bile dizlerinin önüne bir sistem getirir.
Austin Hemmelgarn

4
@AustinHemmelgarn: Akıllı sistemler, son 4 ya da daha fazla işlem kimliğini root için ayırmasının nedeni budur.
Joshua

2
İşlemler neden "boşa" gidiyor? Her çatallanmış işlem, daha fazla işlem yaratmanın sonsuz bir özyinelemesindedir. Bu nedenle sistem çağrısı ek yükü ( forküst üste) ve zamanın geri kalanı işlev çağrısı yaparken (kabuğun çağrı yığındaki her çağrı için artan bir şekilde daha fazla bellek kullanarak) zaman harcıyor .
mtraceur

4
@mtraceur: Sadece çatallaşma başarısız olduğunda başlar.
Joshua

1
Oh, geri alıyorum. Kafamda biraz farklı bir çatal bomba uygulamasının mantığını :(){ :& :; }; :soruyu sormak yerine (bunun gibi:) modelliyordum . Aslında arketipik olanın yürütme akışını tam olarak düşünmedim.
mtraceur

9

90'lı yılların başında yanlışlıkla bunlardan birini kendim çıkardım. Yanlışlıkla execute bit'i, içinde fork () komutu olan bir C kaynak dosyasına ayarlamıştım. Çift tıkladığımda, csh istediğim gibi bir editörde açmak yerine çalıştırmaya çalıştı.

O zaman bile, sistem çökmedi. Unix, hesabınızın ve / veya işletim sisteminizin bir işlem limitine sahip olması için yeterince sağlamdır. Bunun yerine, süper halsizleşiyor ve bir süreci başlatmak için gereken her şeyin başarısız olması muhtemel.

Perdenin arkasında gerçekleşen, süreç tablosunun yeni süreçler oluşturmaya çalışan süreçlerle doludur. Bunlardan biri sona ererse (ya süreç tablosu dolu olduğu için çatalda bir hata olması nedeniyle veya sisteme akıl sağlığını geri yüklemeye çalışan çaresiz bir operatör nedeniyle), diğer işlemlerden biri doldurmak için yenisini dolduracak boşluk.

"Çatal bombası" temel olarak, işlem masanızı dolu tutma görevindeki istemeden kendi kendine onarım süreçleri sistemidir. Bunu durdurmanın tek yolu bir şekilde hepsini öldürmektir.


1
Hepsini bir kerede öldürmek düşündüğünüzden daha kolay - Önce SIGSTOP.
Score_Under

2
@Score_Under - Sorunu oradaki sorunu çözüp çözmeyeceğini görmek için hemen en yakın Harris Nighthawk'a acele etmezsem beni affedersiniz. Başarısız çataldan ölmeden önce bir sinyal göndermesi ve bir diğerinin gerçekleşmesi için bir PID almayı düşünüyorum, zor olabilir ama denemek zorunda kalacağım.
TED

@TED ​​kill -9 -1 burada arkadaş olabilir (çatal bomba kullanan aynı kullanıcıyla; kök ile değil).
Andreas Krey

@AndreasKrey - Bu bayrak tanıdık görünmüyor, bu yüzden 90'lı yıllarımın Nighthawk'ında olduğundan şüpheliyim.
TED

1
@TED: -1bayrak değildir. killyalnızca bir seçenek alır, sonra ayrıştırma seçeneklerini durdurur. Bu -1, tüm işlemler için bir takma ad olan işlem kimliğini öldürür .
Joshua,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.