Kodun son biti ;:
işlevi çalıştırıyor :(){ ... }
. Çatalın olduğu yer burası.
Noktalı virgül ilk komutu sonlandırır ve başka bir taneye başlıyoruz, yani işlevi çağırmak :
. Bu işlevin tanımı, kendisine yapılan bir çağrıyı ( :
) içerir ve bu çağrının çıkışı arka planlı bir sürüme aktarılır :
. Bu, süreci süresiz olarak ilerletir.
Fonksiyonu :()
her aradığınızda C fonksiyonunu çağırıyorsunuz fork()
. Sonunda bu, sistemdeki tüm işlem kimliklerini (PID) tüketecektir.
Örnek
|:&
Başka bir şeyle değiş tokuş edebilirsiniz, böylece neler olup bittiği hakkında bir fikir edinebilirsiniz.
Bir izleyici kur
Bir terminal penceresinde bunu yapın:
$ watch "ps -eaf|grep \"[s]leep 61\""
"Sigorta ertelendi" çatal bombasını ayarlayın
Başka bir pencerede, çatal bombanın biraz değiştirilmiş bir versiyonunu çalıştıracağız. Bu sürüm kendini boğmaya çalışacak, böylece ne yaptığını inceleyebiliriz. Fonksiyonu çağırmadan önce sürümümüz 61 saniye boyunca uyuyacaktır :()
.
Ayrıca ilk çağrının çağrılmasından sonra da arkaplanınız. Ctrl+ z, Sonra yazın bg
.
$ :(){ sleep 61; : | : & };:
# control + z
[1]+ Stopped sleep 61
[2] 5845
$ bg
[1]+ sleep 61 &
Şimdi jobs
komutu ilk pencerede çalıştırırsak şunu göreceğiz:
$ jobs
[1]- Running sleep 61 &
[2]+ Running : | : &
Birkaç dakika sonra:
$ jobs
[1]- Done sleep 61
[2]+ Done : | :
Watcher ile kontrol edin
Bu arada koştuğumuz diğer pencerede watch
:
Every 2.0s: ps -eaf|grep "[s]leep 61" Sat Aug 31 12:48:14 2013
saml 6112 6108 0 12:47 pts/2 00:00:00 sleep 61
saml 6115 6110 0 12:47 pts/2 00:00:00 sleep 61
saml 6116 6111 0 12:47 pts/2 00:00:00 sleep 61
saml 6117 6109 0 12:47 pts/2 00:00:00 sleep 61
saml 6119 6114 0 12:47 pts/2 00:00:00 sleep 61
saml 6120 6113 0 12:47 pts/2 00:00:00 sleep 61
saml 6122 6118 0 12:47 pts/2 00:00:00 sleep 61
saml 6123 6121 0 12:47 pts/2 00:00:00 sleep 61
İşlem hiyerarşisi
Ve bir ps -auxf
de bu süreç hiyerarşisini gösterir:
$ ps -auxf
saml 6245 0.0 0.0 115184 5316 pts/2 S 12:48 0:00 bash
saml 6247 0.0 0.0 100988 468 pts/2 S 12:48 0:00 \_ sleep 61
....
....
saml 6250 0.0 0.0 115184 5328 pts/2 S 12:48 0:00 bash
saml 6268 0.0 0.0 100988 468 pts/2 S 12:48 0:00 \_ sleep 61
saml 6251 0.0 0.0 115184 5320 pts/2 S 12:48 0:00 bash
saml 6272 0.0 0.0 100988 468 pts/2 S 12:48 0:00 \_ sleep 61
saml 6252 0.0 0.0 115184 5324 pts/2 S 12:48 0:00 bash
saml 6269 0.0 0.0 100988 464 pts/2 S 12:48 0:00 \_ sleep 61
...
...
Temizlik zamanı
A killall bash
, işleri ellerinden almadan önce durduracaktır. Temizlemenizi bu şekilde yapmak biraz ağır teslim olabilir, potansiyel olarak her bash
kabuğu yırtılamayacak daha yumuşak bir yöntem aşağıdakileri yapmak olacaktır:
Çatal bombasının hangi sahte terminalde çalışacağını belirleyin
$ tty
/dev/pts/4
Sahte terminali öldür
$ pkill -t pts/4
Yani, ne oluyor?
İyi her çağırma bash
ve sleep
Cı işlevine bir çağrı fork()
ile ilgili bash
komut çalıştırıldığı yerden kabuk.