Syslog-ng dinleme cini durur olmadığını nasıl anlarsınız?

5 Cevap php

Ben (syslog-ng.conf ile) syslog-ng takar bir PHP programı yazdı ve bu temelde bu var:

while (!feof(STDIN)) {
    $input = fgets(STDIN);
    process($input);
}
cleanup();

burada process() ve cleanup() tarafımdan tanımlanır.

Karşılıklı sorunu cleanup(2) çağırdı ve ben bu program çıkmadan önce idam edilmesi gerek asla olmasıdır.

I pcntl_signal() kullanarak SIGTERM, SIGHUP ve SIGPIPE yakalamaya çalıştık ve uygulamanın bu parçası (I öldürmek -1 PHP süreci üzerinde kullanırsanız, benim sinyal işleyicisi çağrılır iyi çalışıyor gibi görünüyor ve {[çalıştırır (1)]}), ama ben syslog-ng gelenler meessages almıyorum görünür.

Ben akışı engelleyen çünkü PHP sinyal eylemcileri demezdim düşünerek, engellenmeyen stdin'i ayarı denedim. Da işe yaramadı, benim sinyal işleyicileri adı olmazdı.

Nasıl syslog-ng benim uygulamayı durdurmak üzereyken biliyor musunuz, bu yüzden bazı temizlik yapabilirim?

Thanks, Tom

UPDATE: I 1-31, tüm sinyalleri yakalamak ve syslog-ng yeniden başlatılması (veya SIGTERM ile öldürüldü) olduğunda hala bir şey almaz denedim.

5 Cevap

Belki de bu yüzden gibi, cleanup() bir PHP shutdown function olarak kayıt deneyin:

function cleanup(){}
register_shutdown_function("cleanup");

Teorik olarak bu php öncesinde çıkmadan fonksiyonunu çalıştırmak için neden olacaktır. Olsa (öldürmek gibi) zorla halt seçenekleri ile birlikte kullanıldığında, bu çalışmayabilir, bu nedenle karanlıkta atış (henüz başka).

Ben olsa çalışan bir şey bulursun. Ben de sonuçlarını öğrenmeye ilgi duyarım.

Edit: I'm glad this worked out for you!

Bu karanlık bir çekim, ancak aşağıdaki gibi döngü yeniden yazma deneyin:

do {
   $input = fgets(STDIN);
   process( $input );
while ( !feof( STDIN ) ) {
cleanup();

Fikir syslog-ng (öyle varsayarak?) Stdout'unu kapandığında, fgets okumak ve aslında EOF ulaşmaya çalışacaktır varlık.

Bir çalışma zamanı hatası (süreç (), fgets tarafından tarafından döndürülen boş bir dize işlemek için hazır değil çünkü EOF ulaştığında) (örneğin) olur çünkü uygun temizleme olmadan PHP komut aniden sonlandırılması muhtemelen.

Ne olacağını görmek için PHP hata günlüğünü etkinleştirin.

Bunu gidermek için deneyebilirsiniz bir kaç şey düşünebilirsiniz:

1) PHP'nin yararlanın set_error_handler() function.

2) atılan olabilecek durumları denemek ve yakalamak için, bir try / catch yapısıyla yukarıda belirtilen kodu koyun.

Eğer bu komut dosyasını çalıştırdığınızda 3), size çıktı ve standart hata hem yakalarken emin olun. Gibi bir şey olmak için komut satırı değiştirin:

/path/to/script 2>&1 >> /path/to/logfile.txt

... Bu hataları yakalamak yardımcı olacaktır.

Gerçekten PHP sinyalleri yakalamak mümkün olmayan bir durumda ise nihayet, sen tuzak komutu ile bir kabuk aracılığıyla bunu yapmak zorunda olacak. Gibi bir şey:

#!/bin/sh
#
# This gets run when the script is hit with a signal
#
trap /path/to/script --cleanup
#
# Run our script
#
/path/to/script 2>&1 >> /path/to/logfile.txt

Özel veri temizleme () ihtiyacı olduğunu Senaryoda varsa, o zaman verileri seri hale ve okumak için temizleme komut dosyası için diske yazma hakkında görmek gerekir.

İyi şanslar!

PHP düşünceli sizin için sinyallerini işlemek mu? Eğer daha fazla kontrole sahip başka bir dilde prototip deneyin.