Start-stop-daemon ile & ile birlikte çalıştırma arasındaki fark nedir?


18

/Etc/init.d içinde bir hizmet ayarlıyorum. Orada çeşitli senaryolara bakıyorum, bazıları ile start-stop-daemon ...ve bazıları ile uygulandı /path/to/script &.

Hepsi pid'i bir dosyaya kaydeder ve bazı kontroller yapar.

En iyi uygulama nedir, farklılıklar nelerdir, burada bilinmesi gerekenler ...? (Genel olarak)

Benim özel durumumda, bir uygulama saatte bir kez çağıracak basit bir hafif localhost http sunucum var ve sadece aptal bir rasgele sayı veriyor (burada daha fazla ayrıntı yok, sadece dosya sistemini kullanmadığı veya bu konuyu sormam durumunda karmaşık konular veya karmaşık şeyler)

Teşekkürler

Yanıtlar:


27

Bir arka plan işi (yani & ile başladı) hala başladığı terminale stdin, stdout ve stderr bağlı. Aniden terminale (örn. Hata mesajları) terminale önyükleme) veya klavyeden giriş beklerken duraklat (önce ön plana koymalısınız). Elbette, arka plan işinin terminale yazmasını önlemek için stdout ve stderr'i bir dosyaya veya / dev / null dizinine yönlendirebilirsiniz.

Bir arka plan işi de ön plana konulabilir - ör. geçerli ön plan işi durdurulur ve fg(ön plan) komutu bir arka plan işini ön plana koymak için kullanılır. Bir arka plan işine terminalden gelen sinyallerle de erişilebilir - ör. Terminali kapattığınızda, genellikle terminalde başlatılan (çoğu) program sona eren SIGHUP.

Öte yandan, init.d tarafından otomatik olarak başlatılan, ancak bir terminalden manuel olarak da başlatılabilen bir daemon, diğer taraftan, herhangi bir terminalin bağlantısını keser. Bir terminalden manuel olarak başlatılmış olsa bile, bir arka plan programının terminalden bağlantısı kesilir, böylece ne yazamaz (stdout, stderr) ne de okuyabilir (stdin). Terminal tarafından "otomatik" olarak gönderilen sinyallere de "bağışıklık" sağlar. (yine de kullanarak sinyal gönderebilirsiniz kill -signal pid).

"Arka plan" ve "ön plan", bir terminalin sürecin durumunu ifade eder - şu anda terminali kontrol eden veya kontrol etmeyen süreç. Daemonlar bir terminale bağlı olmadığından (ancak her şekilde maternik olarak bağlantısı kesildiğinden), arka planda çalıştığı söylenemez. Papatyalar sadece bir terminalle ilişkilendirilmeden - ön ya da arka planda - işleyemezler.

Eğer kullanırsanız psseçeneklerle gösterileri hangi terminal bir süreçtir kullanımları sen öne ve her iki backgroundjobs bir terminal (örn. Tty2) ilişkili olan olduğunu görecektir. Öte yandan cinlerin "?" bu alanda.

Papatyalar elle başlatılsalar da genellikle böyle davranırlar. Kendi daemon'unuzu oluşturmak biraz iştir - onu terminalden tamamen ayırmak için bazı hileler vardır. Çalıştırmak için kendi kullanıcı / grubunu oluşturmalısınız. Dosya oluşturmasını istiyorsanız genellikle / tmp, / var / tmp veya / var / run kullanmalısınız - genellikle başka hiçbir yerde haklara sahip olmamalıdır. Hataları bir terminale raporlayamadığından, bir günlük dosyasına yazmasını sağlamalısınız (örn. / Var / log içinde kendi logfile'i). Daemons, mevcut PID'si ile / var / run'da bir giriş yapmalı ve başka bir örneğinin zaten çalışıp çalışmadığını kontrol etmelidir. Varsa, dosyalar veya aygıtlar için kilitlere (/ var / lock) saygı göstermelidir. SIGHUP'a yapılandırma dosyalarını yeniden yükleyerek yanıt vermeli ve güncellenmiş yapılandırmaları kullanmalıdır.

Başka bir nokta da cinlerin nasıl çalıştığıdır. Bir arka plan programı genellikle iki farklı moddan birinde çalışabilen tek bir yürütülebilir dosyadır; orijinal arka plan programının (ebeveyn) önyüklemede mi yoksa elle mi başlatıldığına veya bu ebeveyn tarafından oluşturulan bir çocuk olmasına bağlı olarak. Üst süreç genellikle oturur ve belirli bir olayı bekler - belirli bir zaman, geçen zaman, belirli bir ağ bağlantı noktasına bağlanma girişimi veya ne olursa olsun. Bu olduğunda, ebeveyn kendisiyle aynı bir çocuk süreci yaratır (fork () sistem çağrısını kullanarak) - ve hemen başka bir olayı beklemeye geri döner (ve belki daha fazla çocuk doğurur). Aslında işi yapacak çocuk süreç - bir komut (örneğin koşma, bir disk senkronize gibi cron) ya da bir ağ bağlantısı kurmaya (örn sshdveyaftpd). Ebeveyn ve çocuk arasındaki tek fark, farklı PID'lere sahip olmaları ve çocuğun PPID'sinin (Ebeveyn-PID) ebeveyn sürecinin PID'si olmasıdır - bu, sürecin ebeveyn mi yoksa çocuk mu olduğunu belirlemek için kullanılabilir. Dolayısıyla, aynı süreç bekleyen (ve yumurtlayan) ebeveyn olarak veya çalışan bir çocuk olarak iki modda çalışabilmelidir.

Bir daemon yazmak zor olmasa da, bu da önemsiz değil - gördüğünüz gibi, ilk önce bilmeniz gereken birkaç "numara" var. Genel olarak, bir daemon yazmanın diğer alternatiflere kıyasla çok az kazanç için çok çaba gerektireceğini düşünürdüm:

Kullanılması nohupveya disownhatta uç kapanır eğer hayatta işlem tutar gibi bir background-iş, genellikle yeterince iyi bir alternatiftir. Stdout ve stderr'i bir dosyaya veya / dev / null'a yönlendirmek genellikle iyi bir fikirdir. Daha etkileşimli programlar için, screenihtiyacınız olana kadar bir şeyi "uzaklara" koymanın iyi bir yoludur. at, batchVe crontabayrıca Consider için değer.


1
Ayrıca eski unix sistem kurslarımdan, bir terminalden başlatıldığında sunucunun da [işlem grubu] ' nu terk etmesi gerektiğini hatırlıyorum [ en.wikipedia.org/wiki/Process_group] . Hatırladığım kadarıyla. Böylece işlem orijinal terminalinden herhangi bir sinyali bağışık hale getirir.
yves Baumes
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.