xinetd, istemci bağlantısını kestiğinde işlemi açık tutuyor


0

Daha önce veya daha az önce bu soruyu yığma akışında sordum ve çözüleceğine inandım (dolayısıyla cevabı kabul etti), ancak sonuçta çözülmediği ortaya çıktı. :-(

Basit bir ifadeyle, sadece sürekli olarak stdout'a metin çıkaran bir python betiği yazdım. Onu bu xinetd dosyasına bağladım

servis hizmetleri
{
    örnekler = 1
    port = 887
    socket_type = akış
    type = UNLISTED
    bekle = hayır
    kullanıcı = kimse
    server = /usr/local/bin/myscript.py
    only_from = 127.0.0.1 192.168.1.2
    devre dışı bırak = hayır
    max_load = 5.0
    güzel = 5
    per_source = 1
}

Bu, bir müşteri bağlandığında olduğu kadar iyi çalışır ve konsolunda metin yaymaya başlar. Sorun, istemci bağlantının koptuğunda, başlatılan işlem bağlantı noktasını engelleyerek açık kalır. İzin verilen yalnızca bir istemci var (örnek = 1), ancak bu durum istemci bağlıyken yeniden başlatıldığında ortaya çıkabilir.

Daha önce bunun python betiğinin öldürme sinyallerini (olduğu gibi) görmezden geldiği için olduğunu düşünmüştüm, ancak bu sabitle aynı davranış gözlendi. Netleştirmek için, -1 öldür vb. Mutlu bir şekilde python betiği tarafından gözlemlenir.

Bunun bir xinetd sorunu olduğunu ve düzeltilmesi oldukça basit olduğunu düşünüyorum.

Yanıtlar:


1

Bir bağlantı koptuğunu algıladığında sunucunun işleminden çıkmasını sağlayın.


AddedSunucunun işletim sistemi TCP bağlantısının kapalı olduğunu tespit ettiğinde, şunu okur ve yazar stdout/ stderrile başarısız olur:

IOError: [Errno 104] Connection reset by peer

Bu nedenle, kodunuzun gerçekleştiği zaman istisnaları görmezden gelmediğinden emin olun.


Bununla birlikte, bu (ve başka herhangi bir yöntem) yalnızca sunucu bağlantının kesildiğini bildiğinde çalışır . Temiz yeniden başlatmalar genellikle tüm TCP bağlantılarını kapatır, ancak “fişi çekmek” yapmaz.


Bu sağlam bir deneyim mi? - çünkü söyleyebildiğim kadarıyla bunu python betiğinden yapmanın bir yolu yok (belki de var)? - "yes" bash komutuna benzer şekilde, çıktıyı sürekli olarak patlatır.
Sirex

@Sirex: sys.stdinTCP soketine bağlanır ve soket kapalıysa sys.stdin.writebaşarısız olur. Aynısı herhangi bir dil için geçerlidir: kapalı bir sokete yazamazsınız.
yerçekimi

tamam, hasta bu soruyu 2 hafta uzağa gideceğim gibi açık bırak, ama geri döndüğümde test edeceğim. Tcp bağlantısının müşteri tarafından temiz bir şekilde kapatılıp kapatılmadığından emin değilim, ancak hastaya bir göz atın. Yukarıdakilerde, sys.stdout ve sys.stdout.write yazısını kastediyorsunuz, elbette?
Sirex

@Sirex: Aslında hem geliyordu sys.stdinve sys.stdout. (Evet, ikisi olmalıydı stdin.read()ya stdout.write().)
grawity

-1

Ayarlamaya çalıştın mı wait = yes?

Belgelere göre, bu

wait — Defines whether the service is single-threaded (yes) or multi-threaded (no).

başlangıçta yardım görünmüyordu, ama daha fazla test edeceğim.
Sirex
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.