Hata ayıklama: Konsol Çıkışı ve Başlatma Komut Dosyaları


16

Python kodunda izlemeler bulmak için bir uptart komut dosyasının çıktısını bir terminale nasıl gönderirsiniz? Sadece bir saniye süren iz bırakmadan bir şeyler yapmak beni sonsuza dek sürüyor. Hataları izlemek için birkaç dosya yazma çağrısı yapmak zorundayım. Daha önce bir geri izleme ile bulmak için gereken ikinci şey birkaç dakika dakikaya dönüyor. Bu perişan. Bu birkaç haftadır sürüyor ve bundan bıktım. bazıları bunun hakkında konuşur mu lütfen. Tekrar bir hata ayıklayıcı olmadan montaj kullanıyor gibi hissediyorum.

Yanıtlar:


27

Upstart 1.4 veya daha yenisini kullanırsanız console log, Upstart işinize girin ve stdout / stderr için tüm çıktılar sona erecektir /var/log/upstart/<job>.log. Ardından tail -f /var/log/upstart/<job>.log &çıkışın terminalde görünmesini sağlayabilirsiniz .


Partiye biraz geç, ama bu cevap beni kurtardı :) Ayrıca bu uptart conf dosyasında herhangi bir özel ayar olmadan benim için çalışıyor gibi görünüyor. Benim açımdan bu kabul edilen cevap olmalı.
rslite

Uptart yönetilen hizmet günlükleri olduğunu bilmiyordum /var/log/upstart. Gerçekten faydalı, teşekkürler.
Francisco

2

Upstart Yemek Tarifleri'nde hata ayıklama teknikleri hakkında bir bölüm var . Yapabileceğiniz en kolay şey --debug, çekirdeğin ayrıntılarını artıracak ve her şeyi syslog'a dökecek olan çekirdek argümanlarınıza eklemektir . Evet, hata ayıklama karmaşıktır, paralelleştirilmiş bir başlangıç ​​sistemi oluşturmak için gereken net karmaşıklığın bir yansımasıdır. Eminim iyileştirme için yer vardır.


2
yemek kitabı, yeni bir gelene hata ayıklama ortamını düzgün bir şekilde açıklamaz. Daha önce benzer açıklamalar gördüm. Ya eksik ya da guru varsayımları var. Topluluğa eklemek isteyen ve yeni başlayanlar için çok sinir bozucu. Asla bir tekerlek dışında yeniden icat, montaj hariç, nerede hata oluştuğu kod satırı sağlamayan bir programlama ortamına koştum, böylece affedilebilir.
bambuntu

O zaman ne önerirsiniz? Bu açık bir belge. Eğer orada sunulanın üzerinde sıçrayan ve sınırlayan bir hata ayıklama tekniğiniz varsa lütfen ekleyin. OP'nin sorunları daha çok, temel unix paradigmalarının, seçildiği ek çalışma zamanı içinde nasıl dağıtıldığına göre nasıl yönetilmesinin anlaşılamamasının bir sonucudur. Sadece python veya [buraya süslü çalışma zamanı dili ekleyin] temel çalışma zamanı UNIX'i görmezden gelin.
ppetraki

2

Bir python arka plan programı yazarken tüm istisnaları yakalarım ve sonra günlük dosyasına atarım. Sadece hata ayıklama için değil, üretimde de kullanıyorum. Her sabah, günlüklerde üzücü bir şey arayan küçük bir senaryom var.

Elbette bu daemon'u çalışır halde tutmaya da yardımcı olur.

Bazı örnek kod (ilginç olmayan parçaları kaldırırım):

import logging

if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s %(levelname)s %(message)s',
                    filename=LOG_FILE,
                    filemode='w')
    logging.info("Sincrod inicializado")
    if not DEBUG:
        daemonize()
    while True:
        try:
            actua()
        except:
            logging.error(sys.exc_info())
        if (datetime.datetime.now().hour > NOITE_EMPEZA\
         and datetime.datetime.now().hour < NOITE_REMATA):
            time.sleep(INTERVALO_NOITE)
        else:
            time.sleep(INTERVALO_DIA)

Actua () gerçek daemon (burada da günlüğe yazar). Ayrıca, ayarlar dosyasında bir DEBUG değişkeni olduğunu unutmayın, Doğru olduğunda, arka plan programı çatalla çalıştırmıyorum, böylece konsolda yürütülür.

Cinler

Arka plan pencereleri, Windows hizmetlerine eşdeğer unix'tir. Diğer süreçlerden bağımsız olarak arka planda çalışan süreçlerdir. Bu, babalarının genellikle init olduğu ve herhangi bir tty'den ayrıldığı anlamına gelir. Bağımsız oldukları için çıktılarını koymak için önceden tanımlanmış bir yer yoktur.

Bir daemon yapmak için çok sayıda python kütüphanesi ve parçacığı var, yukarıdaki örnekte Steinar Knutsens ve Jeff Kunces versiyonlarından bazı fikirleri birleştiren kendi fonksiyonumu kullanıyorum. Mümkün olduğunca basit, iki kez çatallandığımı unutmayın .

def daemonize():
    """Forks this process creating a daemon and killing the original one"""
    if (not os.fork()):
        # get our own session and fixup std[in,out,err]
        os.setsid()
        sys.stdin.close()
        sys.stdout = NullDevice()
        sys.stderr = NullDevice()
        if (not os.fork()):
            # hang around till adopted by init
            ppid = os.getppid()
            while (ppid != 1):
                time.sleep(0.5)
                ppid = os.getppid()
        else:
            # time for child to die
            os._exit(0)
    else:
        # wait for child to die and then bail
        os.wait()
        sys.exit()

İyi tamam. zaten syslog'a giriş yaptığınızdan, o zaman daemon mesajlarınızı filtreleyin ve konsola dökün. Bunun neden yeni başlayanlara özgü olduğunu anlamıyorum? SysV init'inde de aynı sorun var.
ppetraki

Haklısın, sunucularımın çoğunun 8.04 çalıştırdığı gerçeğini söylemek, uptart'a özgü değil. Ancak bu, başlangıç ​​için de geçerlidir. OP, yalnızca uptart ile çalışan bir yöntem için değil, python betiklerinde uptart ile nasıl hata ayıklanacağını soruyordu. Sistem günlüğüne değil belirli bir dosyaya giriş yapıyorum ve burada 'hile' tüm istisnaları yakalayıp yığın izlemeyi bu dosyaya döküyor.
Javier Rivera

Peki, bu sadece bağlama dayalı stdout'u yönetmek değil mi? Bir tty'ye bağlı veya daemon olarak işlev görüp görmediğine bakılmaksızın, eşdeğer günlük ayrıntı düzeyine sahip birçok unix arka plan programı biliyorum. Bu Ruby olsaydı, istisnaların çıktı için kullandığı temel sınıf yöntemini aşırı sürmek veya süslemek isterdim. Eminim Python'da benzer bir şey yapılabilir. Yığın değişimi ile ilgili bu soruyu uygun şekilde sormak daha iyi olabilir. Bu daha çok temel bir unix daemon kodlama / tasarım problemidir ve belirttiğiniz gibi init betikleri ile ilgili özel bir şey yoktur.
ppetraki

Hala dil bilgisini tanıyorum. Ben arka plan ile çalışan belirli bir komut dosyası demek olduğunu düşünüyorum. Kodunuzda, ben sadece komut dosyası çağrısını geri çağırmak için actua () yerine benim komut koymak? Dosya yerine bir konsola kanalize etmek için yine de var mı?
bambuntu

1
tek başına anlamda daemons genellikle başlatıldıkları tty'den ayrılır, orijinal dosya tutamaçlarını stdin, stdout ve stdin'e kapatır ve init'in çocuğudur. Dolayısıyla, belirli bir yere istisna yazdırmak istiyorsanız, bunların nasıl çıktı aldığını öğrenin ve oradan yönlendirin. linfo.org/daemon.html . Yine, bunun uptart ile ilgisi yok, hatta bu konuda init. Programınızın gerçek daemon modunda doğru şekilde çalışmasını sağlayın ve daha sonra hareket ettirin.
ppetraki
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.