Soru Linux cihaza


Linux daemon yazıyorum. Bunu yapmanın iki yolunu buldum.

  1. Arayarak sürecinizi yönetin fork() ve ayar sid.
  2. Programınızı &.

Bunu yapmak için doğru yolu hangisi?


44
2018-06-22 17:30


Menşei


Nohup kullanabilirsiniz: stackoverflow.com/questions/958249/... - rogerdpack


Cevaplar:


itibaren http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16

İşte bir daemon olmak için adımlar:

  1. fork () böylece ebeveyn çıkış yapabilir, bu da kontrolü komut satırına veya programınızı çağıran kabuklara döndürür. Bu adım, yeni sürecin bir süreç grubu lideri olmamasının garanti altına alınması için gereklidir. Bir sonraki adım olan setsid (), eğer bir süreç grubu lideri iseniz başarısız olur.
  2. setsid () bir süreç grubu ve oturum grubu lideri olmak için. Bir kontrol terminali bir seansla ilişkilendirildiğinden ve bu yeni seans henüz bir kontrol terminali elde etmediğinden, bizim prosesimiz artık bir kontrol terminaline sahip değildir, bu da daonsonlar için iyi bir şeydir.
  3. Çatal () yine ebeveyn, (oturum grubu lideri), çıkabilirsiniz. Bu, oturum dışı grup lideri olarak, hiçbir zaman bir kontrol terminalini geri kazanamadığımız anlamına gelir.
  4. İşlemimizin herhangi bir dizinin kullanımda kalmamasını sağlamak için chdir ("/"). Bunu yapmamak, bir yöneticinin bir dosya sisteminden çıkamamasını sağlayabilirdi, çünkü mevcut dizinimizdi. [Eşdeğer olarak, daemonun çalışması için önemli olan dosyaları içeren herhangi bir dizine geçebiliriz.]
  5. umask (0) böylece yazdığımız herhangi bir şeyin izinleri üzerinde tam bir kontrole sahibiz. Biz miras kalmamış olabileceğimizi bilmiyoruz. [Bu adım isteğe bağlıdır]
  6. close () fds 0, 1 ve 2. Bu, ana işlemimizden aldığımız standart giriş, çıkış ve hatayı serbest bırakır. Bu fds'ın nereye yönlendirilebileceğini bilmenin hiçbir yolu yok. Birçok sunucunun _SC_OPEN_MAX limitini belirlemek için sysconf () kullandığını unutmayın. _SC_OPEN_MAX size açık dosyaları / işlemleri açıklar. Daha sonra bir döngüde, daemon tüm olası dosya tanımlayıcılarını kapatabilir. Bunu yapman gerekip gerekmediğine karar vermelisin. Dosya açıklayıcılarının açık olabileceğini düşünüyorsanız, eşzamanlı dosya tanımlayıcılarının sayısında bir sınır olduğundan bunları kapatmalısınız.
  7. Stdin, stdout ve stderr için yeni açık tanımlayıcılar oluşturun. Onları kullanmayı planlamıyor olsanız bile, onları açmak için hala iyi bir fikirdir. Bunların tam olarak ele alınması bir tat meselesidir; Örneğin bir log dosyanız varsa, bunu stdout veya stderr olarak açmak isteyebilirsiniz ve '/ dev / null' dosyasını stdin olarak açabilirsiniz; Alternatif olarak, '/ dev / console' öğesini stderr ve / veya stdout ve '/ dev / null' olarak stdin olarak veya belirli bir arkanız için anlamlı olan başka bir kombinasyon olarak açabilirsiniz.

Daha iyisi, sadece ara artalan () mevcutsa işlev.


77
2018-06-22 17:38



Tüm açık tanımlayıcıları kapatmak zorundasınız. Aksi halde dosyalar örneğin silinmesini engelleyecek bir referansa sahip olmaya devam edebilir. Bu chdir ("/") gibidir. - n-alexander
@ n-alexanderso - daemon () çift çatal mı? - Dannyboy
Ruby WEBrick'de güzel bir örnek göz kamaştırıyor (geçiş kaynağı): ruby-doc.org/stdlib-2.1.1/libdoc/webrick/rdoc/WEBrick/... - Ciro Santilli 新疆改造中心 六四事件 法轮功
daemon () Linux'ta istediğiniz gibi çalışmayabilir. Daemon () man sayfasından: "Bu işlevin GNU C kütüphanesi uygulaması BSD'den alınmıştır ve çift çatal tekniğini (yani çatal (2), setid (2), çatal (2)) kullanmamaktadır. sonuçta ortaya çıkan daemon sürecinin bir oturum lideri olmaması için gereklidir. Bunun yerine, sonuçta ortaya çıkan olay bir oturum lideridir. ” - Jon Spencer


Programınızı hiç bir daemon olarak yazmamayı öneririm. Önceden belirtilen dosya tanıtıcıları, geçerli dizin, işlem grubu vb. İle ön planda çalışmasını sağlayın.

Eğer bu programı bir daemon olarak çalıştırmak isterseniz, start-stop-daemon (8), init (8), runv (runit'den), upstart, systemd ya da işleminizi bir daemon olarak başlatmak için neyi kullanın. Yani, kullanıcınız programınızı nasıl çalıştıracağına karar verir ve bir daemon olarak çalışması gerektiğini zorlamaz.


29
2018-06-23 04:10



+1. En azından, ön planda çalışma seçeneğini sunun. - Nicholas Wilson
Eski bir cevap verdiğim için üzgünüm, ama monit, sürecinizi bir daemon olarak da başlatabilir mi? - allaire


Sadece kullan daemon(3) (dan unistd.h).

Daemon () işlevi programlar içindir   kendilerini kendinden ayırmak isteyen   terminali kontrol etmek ve   sistem daemonları olarak arka plan. ...


12
2018-06-22 17:49



Tavsiyeni görünceye kadar jenkins kullanarak ubuntu'da bir uygulama olarak nasıl çalıştığımı araştıran birkaç gün geçirdim. Teşekkür ederim! Sorunum kabuk komutuyla çözüldü export BUILD_ID=dontKillMe  daemon flask run - barbarian


İlk. İkincisi, arka plan üzerinde çalışan değil, göz alıcıdır. Daemonize programlar kendi oturumunda ve süreç grubunda olmalı ve değil kontrol terminali var.


5
2018-06-22 17:37



ama hala kendi oturumunu ve süreç grubunu belirleme kullanımının ne olduğunu anlayamıyorum - Poorna


Aslında bir daemon yapmak için çifte çatal lazım.

Programı bir & ile çalıştırdığınızda kabuk arka planda programı çalıştırır, bu da onu bir daemon yapmaz. Daemonlar ebeveyn olarak init (pid 1), bu yüzden çifte çatal gereklidir.

Öyleyse, bir şey yapmanın güzel yolu, eğer programın bir daemon ise, bu konuyu kendiniz halledecektir (daha fazla yöntem vardır, bkz. İşte çok). Start-stop-daemon programını da kullanabilirsiniz.


2
2018-06-22 17:37





Hangi dili kullanıyorsunuz? Bazı diller, dürüstleştirmeyi kolaylaştıran yardımcı yöntemlere sahiptir. Örneğin, Ruby cinleri paketi.


2
2018-06-22 17:39



c ++ kullanıyoruz - Poorna