Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

Subprocess Çağırdım, Segfault Yedim: Ana Script'im de Öldü!

websterx

Üye
Katılım
14 Mart 2026
Mesajlar
33
💥 "Bu Kadar da Olmaz Artık!" Anı

Dün gece otomasyon sistemimin son halini test ediyordum. Ana koordinatör script'im master_runner.py, sırayla birkaç alt işlemi subprocess.call() ile çalıştırıyordu. Her şey güllük gülistanlıktı, ta ki data_processor adlı o lanet C++ binary'si çalışıncaya kadar.

🖥️ Terminaldeki Sessiz Ölüm

Terminalde ana script'in çıktılarını izliyorum. İlk iki işlem tamam, sıra üçüncüde. Script şu satırı çalıştırdı:
Python:
subprocess.call(['./data_processor', 'input.bin'])
Ve ekran... dondu. Hiçbir şey. Cursor yanıp sönmeye devam ediyor ama komut asla geri dönmüyor. Ctrl+C'ye bastım, basmadım kalmadı. Meğerse alt işlem segfault yemiş ve bu ölümcül hata, tüm boruyu tıkamış. Ana script'im de, sanki oğlunun cenazesini bekleyen bir baba gibi, asla gelmeyecek bir çıkış kodu için sonsuza kadar beklemeye kalmış.

🔍 Sorun Neydi? Meğerse...

subprocess.call() güvenilir bir arkadaştır, ama çocuk sürecin (child process) her şeyini bekler. O süreç segfault ile ölürse ve bu işletim sistemi seviyesinde bir çöküşse, bazı durumlarda call() o sinyali doğru işleyemez ve takılır kalır. StackOverflow'da bile benim durumuma tam uyan bir çözüm bulamadım, şaka gibi.

🛠️ Çözüm? "communicate()" veya Timeout!

İsyanımı bitirip kodu yeniden yazdım. Artık subprocess.Popen() kullanıyorum ve çıktıyı communicate() ile okuyorum. Daha da önemlisi, bir timeout parametresi ekledim. Şimdi kodum şöyle bir şeye benziyor:
Python:
try:
    proc = subprocess.Popen(['./data_processor', 'input.bin'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = proc.communicate(timeout=30) # 30 saniye bekler, geçerse öldürür.
except subprocess.TimeoutExpired:
    proc.kill()
    print("Vah vah, işlem takıldı. Muhtemelen segfault!")
Böylece ölü bir süreç yüzünden tüm sistemim çakılmıyor. Hata yakalanıyor ve log'a düşüyor.

Siz de böyle bir "ölümcül bekleyiş" yaşadınız mı? subprocess.call() yerine hangi yöntemleri tercih ediyorsunuz? Ya da segfault'ları Python'dan yakalamanın daha temiz bir yolu var mı?
 

Tema özelleştirme sistemi

Bu menüden forum temasının bazı alanlarını kendinize özel olarak düzenleye bilirsiniz.

Zevkine göre renk kombinasyonunu belirle

Tam ekran yada dar ekran

Temanızın gövde büyüklüğünü sevkiniz, ihtiyacınıza göre dar yada geniş olarak kulana bilirsiniz.

Geri