Konteynerde PID 1 Problemi: Zombi Süreçler ve Init Ne Zaman Gerekir
Bir konteynerin ilk süreci çekirdek için sıradan bir süreç değildir. Bu farkın nasıl zombi süreç birikimine yol açtığını, cgroup pid limitine nasıl çarptığını ve tini, dumb-init ya da tam bir süreç yöneticisi arasında nasıl seçim yapılacağını anlatıyoruz.
Bir konteyner başlatıldığında içindeki ilk süreç Linux çekirdeği için PID 1 olur ve PID 1, normal bir sürecin sahip olmadığı iki sorumluluk taşır. Birincisi sinyal davranışı: çekirdek, bir sürece SIGTERM veya SIGINT gibi bir sinyal gönderildiğinde o süreç kendi işleyicisini (handler) tanımlamamışsa varsayılan işleyiciyi uygular, ama bu kural PID 1 için geçerli değildir. Normal bir süreç SIGTERM aldığında varsayılan davranışı sonlanmaktır; PID 1 için varsayılan davranış hiçbir şey yapmamaktır. İkincisi süreç toplama (reaping): bir alt süreç sonlandığında ebeveyni onun çıkış koduyla wait() çağırana kadar çekirdek o süreci zombi (defunct) olarak tutar. Normal bir süreç ağacında yetim kalan alt süreçler PID 1'e miras kalır ve init sistemleri (systemd, SysV init) tam olarak bu mirası toplamak için yazılmıştır. Konteyner içindeki PID 1 ise çoğunlukla bir web sunucusu, bir uygulama süreci ya da bir kabuk betiğidir ve bu iş için tasarlanmamıştır.
Bu iki sorumluluk göz ardı edilebilir gibi görünür çünkü çoğu konteyner tek bir süreç çalıştırır ve hiç alt süreç doğurmaz. Sorun tam olarak alt süreç doğurulduğu ama düzgün toplanmadığı yerde başlar.
Zombi süreç nasıl birikir
Tipik birikim deseni şöyledir: uygulama periyodik bir görevi arka planda çalıştırmak için bir kabuk çağırır, kabuk komutu & ile arka plana alır ve hemen çıkar. Kabuk çıktığında arkada bıraktığı süreç yetim kalır ve PID 1'e miras kalır. PID 1 bu süreci wait() ile toplamıyorsa süreç işi bitince zombi olarak kalır. Tek seferlik bir arka plan görevi bunu fark ettirmez; dakikada bir ya da saatte onlarca kez çalışan bir zamanlayıcı görevi bunu hızla biriktirir.
Zombiler bellek veya CPU tüketmez, ps çıktısında <defunct> olarak görünür ve zararsız gibi durur. Asıl sınır Linux'un cgroup pids denetleyicisidir: her zombi bir PID slotunu işgal etmeye devam eder ve pids.max sınırına yaklaşıldığında yeni süreç oluşturma (fork()) başarısız olmaya başlar. Bu noktada arıza zombilerin kendisinde değil tamamen ilgisiz bir yerde çıkar: konteyner içinde yeni bir komut çalıştırılamaz, yeni bir istek işleyici forklanamaz, zamanlayıcı sessizce durur. Sağlık kontrolü genelde ana sürecin canlılığına bakar ve ana süreç hâlâ ayaktaysa yeşil kalmaya devam eder; arızayı gösteren tek işaret cgroup metriklerinde artan pids.current değeri ya da günlükteki tek satırlık bir fork: Resource temporarily unavailable hatasıdır.
Üç yaklaşım
Bu sorunu çözmenin üç yolu var ve hangisinin doğru olduğu konteynerin ne çalıştırdığına bağlı.
Birinci yol hafif bir init süreci kullanmaktır. tini ve dumb-init tam olarak bu iş için yazılmış, birkaç yüz satırlık, tek görevi PID 1 olup sinyalleri gerçek uygulamaya iletmek ve yetim kalan süreçleri toplamak olan ikili dosyalardır. Docker'da docker run --init bayrağı, Docker'ın kendi gömdüğü tini'yi konteynerin PID 1'i yapar ve asıl komutunuzu onun altında alt süreç olarak başlatır; Compose'da aynı davranış servis tanımına init: true eklenerek elde edilir. Kendi imajınıza tini'yi gömüp ENTRYPOINT ["/usr/bin/tini", "--", "/uygulama"] yazmak da aynı sonucu verir ve imajın Docker'ın init desteğine bağımlı kalmamasını sağlar.
İkinci yol tam bir süreç yöneticisi kullanmaktır: s6-overlay ya da supervisord gibi araçlar hem PID 1 sorumluluklarını üstlenir hem de aynı konteynerde birden fazla süreci yönetip birinin çökmesi durumunda onu yeniden başlatabilir. Bu, tek konteynerde gerçekten birden fazla uzun ömürlü süreç çalıştırmanız gerektiğinde (örneğin bir uygulama sunucusu ve yanında bir log toplayıcı) anlamlıdır; tek süreçli bir konteynere sadece zombi toplamak için tam bir süreç yöneticisi koymak gereksiz karmaşıklıktır.
Üçüncü yol hiçbir şey eklememek ve bunun bilinçli bir karar olmasını sağlamaktır. Uygulama hiç alt süreç doğurmuyorsa (çoğu modern web sunucusu ve dil çalışma zamanı bunu yapmaz) zombi birikme riski zaten yoktur ve init eklemek sinyal iletimine bir katman daha eklemekten başka bir şey yapmaz.
Kubernetes'te durum farklı
Docker'ın --init bayrağının Kubernetes'te birebir karşılığı yoktur; Pod spesifikasyonunda bir konteynerin PID 1'ine init sarmalayıcısı ekleyen bir alan bulunmaz. Bu yüzden Kubernetes'te çalışacak imajlar için init'i imajın kendisine gömmek gerekir: ENTRYPOINT ["tini", "--", ...] deseni container runtime'dan bağımsız çalışır, çünkü PID 1'i belirleyen containerd ya da CRI-O değil imajın kendi ENTRYPOINT'idir. shareProcessNamespace: true ile bir pod içindeki konteynerlerin süreç isim alanını paylaştırmak farklı bir sorunu çözer (bir sidecar'ın ana konteynerin süreçlerini görebilmesi) ve zombi toplama sorununu kendiliğinden çözmez; paylaşılan isim alanındaki PID 1 yine pause konteyneri ya da ilk konteynerin kendisidir.
Sık düşülen tuzaklar
Dockerfile'da CMD ya da ENTRYPOINT kabuk biçiminde yazıldığında (CMD myapp --flag) Docker bunu örtük olarak /bin/sh -c "myapp --flag" şeklinde çalıştırır. Bu durumda PID 1 uygulamanız değil sh olur, sinyaller sh'ye gider ve sh çoğu sinyali alt sürecine iletmez; konteyner docker stop ile durdurulmaya çalışıldığında zarif kapanma süresi hiç kullanılmadan SIGKILL ile sonlanır. Çözüm exec biçimini kullanmaktır: CMD ["myapp", "--flag"]. tini veya dumb-init eklerken de aynı hataya düşülebilir; sarmalayıcıyı kabuk biçiminde çağırmak onu da bir sh katmanının arkasına gizler.
İkinci tuzak, gosu veya su-exec gibi ayrıcalık düşürme araçlarını init ile birlikte kullanırken sırayı karıştırmaktır. Doğru sıra PID 1'in tini olması, tini'nin ayrıcalık düşürme aracını çağırması, onun da asıl uygulamayı exec etmesidir; tersi sıralamada tini uygulamanın üstünde değil bir ara kabuğun üstünde durur ve toplama zinciri yine kopar.
Üçüncü tuzak, zombi birikimini yalnızca bellek ve CPU grafiklerinden izlemeye çalışmaktır. Zombiler bu metriklerde görünmez; doğru ölçüt ps -eo stat,ppid | awk '$1 ~ /^Z/' | wc -l ile zombi sayısını saymak ya da cgroup v2'de /sys/fs/cgroup/pids.current değerinin pids.max'e ne kadar yaklaştığını izlemektir. Bu iki metrik izlenmediği sürece sorun ancak pids.max sınırına gerçekten çarpılınca, çoğunlukla en yoğun anda ortaya çıkar.
Ne zaman uğraşmaya değmez
Tek bir uzun ömürlü sürecin çalıştığı, o sürecin kendisi hiç fork etmediği ve içeride cron benzeri bir zamanlayıcı bulunmayan bir konteynerde init eklemek gereksiz bir katmandır. Riski değerlendirmenin pratik yolu imajın içine girip ps -ef ile hangi süreçlerin çalıştığına bakmak ve uygulamanın kod tabanında exec, fork, subprocess, Process.Start gibi çağrıları aramaktır. Hiçbiri yoksa PID 1'in özel davranışı hiç devreye girmez. Varsa, birkaç megabaytlık bir ikili dosya eklemenin maliyeti, üretimde bir gün ansızın "yeni süreç oluşturulamıyor" hatasıyla karşılaşmanın maliyetinden çok daha düşüktür.
1-5 tab geçiş ·
tab sonraki ·
esc geri al ·
↓ kaydır
> ls -lah ~/services/ --sort=tier
[OK] 25 records · 8 featured · 1 retainer · 16 standard
/02 hizmetler
services.tree
> note
· Fiyatlar USD cinsindendir. 6-12 günlük projelerde %7, 13+ günlük projelerde %14 hacim indirimi uygulanmaktadır. 100 adam-gün ve üzeri kapsamlı programlarda proje bazlı özel fiyatlandırma yapılır. Fiyatlar kapsam, aciliyet ve uzun dönem iş birliğine göre müzakere edilebilir.
> ls ~/products/ --open-source
[OK] 2 entries · 1 live · 1 pre-release
/03 ürünler
products.list
liveaçık kaynak · mit/prod/01
filex
her yere gömülebilen self-hosted dosya yöneticisi
tek go binary · vue/react/web-component embed · 5 storage sürücüsü · realtime collab · rbac · native multi-tenancy · ai ajanları için mcp server
Altyapıyı kurar, otomasyonu sağlar, sistemi ayakta tutar.
BRF Teknoloji, Bursa merkezli bir DevSecOps ve yazılım danışmanlık firmasıdır. Kubernetes cluster yönetiminden serverless platform kurulumuna, CI/CD pipeline tasarımından AI agent geliştirmeye kadar 25 farklı hizmet alanında çalışıyoruz.
İşimizin özü basit: sisteminizi ayağa kaldırır, otomatize eder ve gece 3'te sizi uyandırmayacak hale getiririz. Terraform ile altyapınızı kodlar, ArgoCD ile deploy sürecinizi GitOps'a taşır, Prometheus ile her şeyi izleriz. Bir şey bozulursa — biz bozulmadan önce müdahale ederiz.
Vendor lock-in'e karşıyız. Açık kaynak araçlarla, self-hosted çözümlerle ve endüstri standardı teknolojilerle çalışırız. Knative üzerinde kendi serverless platformunuzu kurarız, Kata Containers ile izole ederiz, Vault ile secret'larınızı yönetiriz. Her projeyi net kapsam, net süre, net fiyatla teslim ederiz.
DevSecOps & CI/CD
Kubernetes & Serverless
Infrastructure as Code
AI & Agent (MCP/ACP)
Güvenlik & Sıfır Güven
Full-Stack Geliştirme
Self-Hosted Çözümler
> grep -i question ~/faq.md
[OK] 3 entries · click to expand
[?]BRF Teknoloji'nin DevOps çözümleri hangi hizmetleri içerir?▾
CI/CD pipeline kurulumu, Kubernetes cluster yönetimi, container migrasyonu, Terraform ile altyapı otomasyonu, monitoring & alerting, şirket içi teknoloji kurulumları ve DevOps danışmanlık hizmetleri sunuyoruz.
[?]Yazılım geliştirme hizmetleriniz nelerdir?▾
MVP geliştirme, mevcut yazılım performans optimizasyonu, backend API geliştirme (Node.js, Go, Python) ve tam stack uygulama geliştirme hizmetleri sunuyoruz. Her projede teknik borç minimumda tutularak teslim edilir.
[?]Hangi DevOps araçlarıyla çalışıyorsunuz?▾
Kubernetes ve Docker’dan Talos Linux’a, Terraform ve OpenTofu’dan Ansible’a, Jenkins, GitLab CI/CD, GitHub Actions, ArgoCD, Flux, Helm ve Rancher’a kadar endüstri standardı araçlarla çalışıyoruz. İzleme ve hata takibinde Prometheus, Grafana, Loki, Tempo, OpenTelemetry ve GlitchTip; ağ katmanında Cilium ve Envoy; test otomasyonunda Playwright, Cypress, k6, Locust, Testcontainers ve Trivy kullanıyoruz. Projenizin ihtiyacına göre en uygun araç setini birlikte belirliyoruz.
brf.sh / 2026
·bursa/tr·
timezone utc+3·
tüm sistemler nominal
> ./connect --target=brf.sh
/05 iletişim
contact.txt
> cat contact.txt
[email][email protected] [phone]+90 530 871 2248 [location] Üçevler Mah. İzmir Yolu Cad 241D 16120 Nilüfer/Bursa [hours] Hafta içi 09:00 — 18:00 UTC+3 [eta] <24s iş günü
[OK] handshake ready
· turnstile enabled
· yanıt süresi: <24s · saat dilimi UTC+3 / bursa
CI/CD Pipeline Kurulumu
GitHub Actions, GitLab CI/CD ile otomatik build, test ve deploy süreçleri.
Mevcut ya da sıfırdan bir repo için otomatik build, test ve deploy pipeline'ı kurulur. GitHub Actions, GitLab CI/CD veya tercih edilen araç kullanılır. Staging + production ortamları için ayrı akışlar tanımlanır.
Mevcut uygulamaların container mimarisine taşınması.
Mevcut uygulamaların container mimarisine taşınması. Docker image tasarımı, Compose yapılandırması ve Kubernetes manifest'lerine dönüştürme. İleri düzey izolasyon için Kata Containers / gVisor dahil edilebilir.
Prometheus, Grafana, Loki ile altyapı ve servis izleme.
Prometheus + Grafana stack kurulumu, servis ve altyapı metrikleri için dashboard'lar, kritik eşikler için alert tanımları. İsteğe bağlı: Zabbix, Loki log aggregation.
GitLab, Nextcloud, VPN, mail sunucusu gibi şirket içi araçlar.
GitLab, Mattermost, Nextcloud, mail sunucusu, VPN, iç monitoring gibi araçların şirket sunucularında kurulumu. Docker Compose veya Kubernetes üzerinde deploy edilir.
MCP/ACP agent'lar, RAG pipeline, multi-agent orchestration, model serving.
LLM entegrasyonu (OpenAI, Claude, Gemini, lokal modeller), MCP (Model Context Protocol) ve ACP (Agent Communication Protocol) ile tool-augmented AI agent'lar. RAG pipeline, multi-agent orchestration, model serving (vLLM/Ollama). Mevcut iş süreçlerine yapay zeka katmanı.
Apache Kafka, RabbitMQ, NATS ile event-driven data pipeline. Apache Airflow ile ETL/ELT orkestrasyon, real-time data akışı, CDC (Change Data Capture). Data lake/warehouse tasarımı, schema registry, dead letter queue yönetimi.
Paketler
Kafka/RabbitMQ kurulumu + temel producer/consumer
$3,500
5–7 adam/gün
ETL pipeline (Airflow + source → warehouse)
$5,200
8–12 adam/gün
Tam event-driven architecture (CDC + streaming + DLQ)
ELK Stack veya Loki + Grafana ile merkezi log yönetimi. OpenTelemetry ile distributed tracing, Jaeger/Tempo entegrasyonu. Log retention politikası, structured logging standartları, anomaly detection. Tüm servislerde uçtan uca observability.
Playwright, Cypress ile E2E test otomasyonu, k6/Gatling ile yük testi. CI/CD pipeline'a entegre pre-deploy quality gate, test coverage raporlama, visual regression testing. AI-assisted test generation ile test yazım süresini %60'a kadar düşürme.
Backstage veya Port ile internal developer portal kurulumu. Self-service ortam oluşturma, golden path template'leri, service catalog, TechDocs entegrasyonu. Developer experience (DX) metrikleri, DORA metrics takibi, cognitive load azaltma.
Paketler
Backstage/Port kurulumu + service catalog
$3,900
6–8 adam/gün
Golden path templates + self-service ortam
$6,500
10–14 adam/gün
Tam platform (portal + templates + DORA + DX metrikleri)
Toplanan Kişisel Verileriniz, Toplanma Yöntemi ve Hukuki Sebebi
Kimliğinizi belirli ya da belirlenebilir kılan her türlü bilgi "kişisel veri" olarak kabul edilmektedir. Web sitemizi ziyaret ettiğinizde veya hizmetlerimizi kullandığınızda; ad, soyad, e-posta adresi, telefon numarası gibi iletişim bilgileriniz, IP adresiniz ve tarayıcı çerez verileri otomatik ya da yarı-otomatik yollarla toplanabilir. Bu veriler, 6698 sayılı Kişisel Verilerin Korunması Kanunu'nun 5. maddesinde belirtilen "bir sözleşmenin kurulması veya ifasıyla doğrudan doğruya ilgili olması" ve "ilgili kişinin temel hak ve özgürlüklerine zarar vermemek kaydıyla, veri sorumlusunun meşru menfaatleri için veri işlenmesinin zorunlu olması" hukuki sebeplerine dayanılarak işlenmektedir.
Kişisel Verilerinizin İşlenme Amacı
Toplanan kişisel verileriniz; hizmetlerimizin sunulması ve iyileştirilmesi, müşteri taleplerinin karşılanması, yasal yükümlülüklerin yerine getirilmesi, bilgi güvenliği süreçlerinin yürütülmesi ve iletişim faaliyetlerinin yönetilmesi amaçlarıyla işlenmektedir. Verileriniz, belirtilen amaçlarla sınırlı ve ölçülü olarak işlenir; amacın ortadan kalkması halinde silinir, yok edilir veya anonim hale getirilir.
Toplanan Kişisel Verilerin Kimlere ve Hangi Amaçlarla Aktarılabileceği
Kişisel verileriniz; yasal düzenlemelerin gerektirdiği hallerde kamu kurum ve kuruluşlarına, hizmetlerin sunulması amacıyla iş ortaklarımıza ve teknik altyapı sağlayıcılarına, hukuki uyuşmazlıklarda avukatlar ve danışmanlara aktarılabilir. Aktarım, Kanun'un 8. ve 9. maddelerine uygun olarak, gerekli teknik ve idari tedbirler alınarak gerçekleştirilir.
Kişisel Verileri İşlenen Kişi Olarak Haklarınız
6698 sayılı Kanun'un 11. maddesi uyarınca; kişisel verilerinizin işlenip işlenmediğini öğrenme, işlenmişse bilgi talep etme, işlenme amacını ve amacına uygun kullanılıp kullanılmadığını öğrenme, yurt içinde veya yurt dışında aktarıldığı üçüncü kişileri bilme, eksik veya yanlış işlenmişse düzeltilmesini isteme, Kanun'un 7. maddesindeki şartlar çerçevesinde silinmesini veya yok edilmesini isteme, yapılan işlemlerin aktarıldığı üçüncü kişilere bildirilmesini isteme, münhasıran otomatik sistemler vasıtasıyla analiz edilmesi suretiyle aleyhinize bir sonucun ortaya çıkmasına itiraz etme ve kanuna aykırı işleme sebebiyle zarara uğramanız halinde zararın giderilmesini talep etme haklarına sahipsiniz. Bu haklarınızı kullanmak için web sitemizdeki iletişim kanalları aracılığıyla bize başvurabilirsiniz.
Şartlar ve Koşullar
Şartlar ve Koşullar
1. Hizmet Kapsamı ve Değişiklikler
BRF Teknoloji, sunduğu yazılım geliştirme, DevOps danışmanlık, altyapı kurulumu ve teknik destek hizmetlerini bu şartlar ve koşullar çerçevesinde yürütür. Hizmet kapsamı, her proje için ayrıca belirlenir ve karşılıklı mutabakat ile kesinleştirilir. BRF Teknoloji, sunduğu hizmetlerin kapsamını, fiyatlandırmasını ve teknik detaylarını önceden bildirmek kaydıyla güncelleme hakkını saklı tutar.
2. Gizlilik Politikası
Hizmetlerimiz kapsamında toplanan kişisel veriler, Gizlilik Politikamız çerçevesinde işlenir. Detaylı bilgi için Gizlilik Politikası sayfamızı inceleyebilirsiniz.
3. Hizmet Kullanımı ve Sorumluluklar
Müşteriler, sunulan hizmetleri yalnızca yasal ve etik çerçevede kullanmayı kabul eder. Hizmetlerin kötüye kullanılması, üçüncü taraf haklarının ihlali veya yasa dışı faaliyetler için kullanılması durumunda BRF Teknoloji hizmeti askıya alma veya sonlandırma hakkına sahiptir. Müşteri, proje kapsamında sağladığı bilgilerin doğruluğundan ve güncelliğinden sorumludur.
4. Ödeme Şartları
Ödeme koşulları proje bazında belirlenir ve proje başlangıcında karşılıklı mutabakat ile kesinleştirilir. Aksi belirtilmedikçe, faturalar proje tesliminden itibaren 15 gün içinde ödenir. Geciken ödemelerde aylık %2 gecikme faizi uygulanabilir.
5. İptal ve İade Politikası
İptal talepleri, hizmetin başlangıç tarihinden en az 7 gün önce yazılı olarak bildirilmelidir. Başlamış projelerde, tamamlanan iş oranına göre ücretlendirme yapılır. Proje kapsamında özel olarak geliştirilen yazılım ve altyapı bileşenleri için iade yapılmaz.