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 ps
seç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 sshd
veyaftpd
). 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ı nohup
veya disown
hatta 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, screen
ihtiyacınız olana kadar bir şeyi "uzaklara" koymanın iyi bir yoludur. at
, batch
Ve crontab
ayrıca Consider için değer.