Arka plan veya önyükleme komut dosyasının günlük çıktısı


10

Belirli olaylar için bir sistem arka plan programı tarafından yürütülen kısa bir komut dosyası var. Olay meydana geldiğini ve senaryo yürütüyor biliyorum, ama niyetinde ne yapmaz. Garip bir şekilde, manuel olarak çalıştırdığımda bunu yapar, bu yüzden çok kafam karıştı.

Neler olup bittiğini nasıl anlayabilirim? Komut dosyası temelde şöyle bir dizi komuttur:

/bin/foo on 3
sudo bar a

Bunun sistem komut dosyalarında hata ayıklama konusunda bir eğitim olması gerektiğini anlıyorum, ama biraz da öyle U&L. Başlığı yanlış okudum ve "Hata ayıklama için bir sistem komut dosyasının çıktısını günlüğe kaydetme" amacını daha net hale getirir. Ayrıca bu foo barörnekleri okuduğumda beynim donuyor , daha gerçek dünyaya benzeyen bir şeyi tercih ediyorum. Herhangi bir yayını düzenlemek istemiyorum, bu yüzden geliştirilebileceğini düşünüyorsanız bunu size bırakacaktır.
Milliways

1
@Milliways Haklısın, "sistem betiği" zaten yanlış bir isimdi, bu yüzden başlığı değiştirdim. Foobar şey hakkında aynı fikirde değilim - insanların herhangi bir kültürde olduğu gibi ortak lingo / konuşma dilleri tanımayı öğrenmeleri gerekir. Ayrıca ikisini bir araya getirdiğinizde hala iyi bir kıkırdama.
goldilocks

Yanıtlar:


8

İlk olarak, komut dosyası bir sistem arka plan programı tarafından çalıştırılıyorsa ve bu arka plan programı kök ayrıcalıklarıyla çalışıyorsa, kullanmanıza gerek yoktur sudo. Buna aşağıdakileri içeren init(ve systemd) dahildir rc.local. O süreç ise değil root ayrıcalığı ile çalışan, daha sonra sudosürece çalışmaz /etc/sudoersböyle (ve şifre olmadan) izin verecek şekilde yapılandırıldı. Raspbian kullanıcıları, pikullanıcının varsayılan olarak herhangi bir şey yapmasına izin verildiğinden (ve eğer bakarsanız /etc/sudoersbunun nasıl yapıldığını göreceksiniz) bununla karıştırılabilir.

Ardından, herhangi bir bashkomut dosyasından veya bir bash komut dosyası içindeki herhangi bir komut kümesinden, bunları aşağıdaki gibi bir alt kabukta yürüterek yakalayabilirsiniz : 1

(
    /bin/foo on 3
    sudo bar a
) &> /var/log/myTestLog.txt

()Belirten bir altkabuk . Bunun içindeki her şeyden elde edilen tüm çıktılar bir /var/log/myTestLog.txtdosyaya yönlendiriliyor . Birkaç not:

  • &>Bir olan bashism nedenle komut dosyası bir eliyle yürütülür eğer shebang ilk satırda, olması gerektiği #!/bin/bashdeğil sadece, /bin/sh. "Bashizmler" sadece bashkabukta çalışır.

    Bu, /etc/rc.localvarsayılan olarak kullananları içerir /bin/sh(yani, evet, bunu güvenli bir şekilde değiştirebilirsiniz /bin/bash).

  • /var/logyazmak için kök ayrıcalıkları gerekir. İşlem böyle değilse, yapabileceğini bildiğiniz bir dizin kullanın veya oluşturun. Şüphe duyduğunuzda, sistemi kapatmaya veya yeniden başlatmaya gerek kalmadan bunu test edebiliyorsanız /tmp, dünya tarafından yazılabilir (yani, herkes tarafından) kullanın. Ancak /tmpbotlar arasında devam etmez. Aynı zamanda küçük, RAM tabanlı bir bölümdür, bu yüzden ona veri konserleri yazmayın. SD kartınız değil [aslında Raspbian'ın şu anki sürümlerinde, ama pratikte buna güvenmeyin] .

  • &>içindeki herhangi bir şeyin üzerine yazacak myTestLog.txt. Bunun yerine, hata ayıklama amaçları için iyi bir fikir olabilecek mevcut bir günlüğe eklemek istiyorsanız kullanın &>>. Daha sonra bu alt kabuğun başına şu şekilde bir komut ekleyebilirsiniz:

    echo Starting $(date)

    Bilgileri her çalışmadan ayırmak için. Bunun ne yaptığından emin değilseniz, komut satırında deneyin.

Bu son nokta, hiçbir şey vermeyen komutlar için yapabileceğiniz bir şeyin iyi bir gösterimidir - ancak çoğu, örneğin -v"ayrıntılı" için eklerseniz bunu yapar . Bazı komutlara dikkat edin, -v"sürüm bilgilerini yazdır" anlamına gelir. Bunun nasıl çalışacağından ve nasıl çalışacağından emin olmak için komutun man sayfasına bir göz atın (bazı komutlar ayrıca farklı bir anahtar kullanır -v).

Kural olarak, komutlar tamamlandığında 0 değerini de döndürür. Buna bazen "çıkış durumu" denir ve normalde görmezsiniz, ancak kabuk size gösterecektir echo $?. Deneyin

 ls /
 echo $?
 ls /nonexistantdir
 echo $?

0 ve 2 alırsınız. Daha sonra man sayfasında ls"Çıkış durumu" için arama yaparsanız, oldukça spesifik olmayan şifreli görürsünüz:

2      if serious trouble (e.g., cannot access command-line argument).

Hangisi daha iyi olabilir veya olmayabilir, ama işte gidiyorsunuz.

En azından bu, komutun bir nedenden dolayı başarısız olduğunu gösterir. Çıkış durumu ayrıca aşağıdaki gibi şeyler yapmanızı sağlar:

/bin/foo && sudo bar

&&"İlk komut başarılı olursa" bu durumda araçlarında, ilk komutu varsayarsak (genellikle yaptıkları neden olan) 0 ile dönmesi kuralı kullanır. Eğer /bin/fooişe yaramazsa, bulunamaz vb., O sudo barzaman asla olmayacaktır.

Günlük iletilerini ve koşullu yürütmeyi ( &&) bir arada kullanmak , sorunu anlamanıza veya en azından sorunu çözmenize yardımcı olabilecek başkaları için yararlı olabilecek bilgiler edinmenize çok daha yakın olmalıdır. Bu olmadan, diğer herkesin sık sık yapabileceği tahminidir.


1. Komut dosyasının tamamını içeriden aynı çıktı yönlendirmesini kullanarak şunları yapabilirsiniz:

exec &> /var/log/myTestLog.txt

Üstte (veya herhangi bir yerde ve sonraki her şey için geçerli olacaktır).


2

İnsanlar betik olarak betik çalıştırırken unutmaya eğilimli önemli bir yönü kabuk ortamı ve $PATHözellikle de değişkendir. Senin örnekte, ikinci satır dayanır $PATH: tam adı sudoIS /usr/bin/sudove kullanıcı kabuk sadece söylendi çünkü aramak için olduğunu bilir /usr/binyürütülebilir ararken. Aynı şey için de geçerlidir bar.

sudoKomut dosyalarını cin olarak çalıştırırken bunun gerekli olmadığı düşünüldüğünde, ikinci satırınız şöyle görünmelidir:

/path/to/bar a
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.