İnit.d tarafından başlatılan süreci canlı tutmanın standart veya en iyi yolu


14

Bir init.dkabuk komut dosyası tarafından başlatılan bir daemon'u canlı tutmak için standart bir yol veya en iyi uygulamayı arıyorum .

Ya da daha iyisi, doğrudan canlı tutmanın bir yolu var /etc/init.dmı?

Özellikle, dtnd ile adlandırılan bir daemon ve beklenmedik sona eren süreci arayan sonsuz döngü var, varsa, daemon onları tekrar uyandır. Ayrıca, verilen bir sistem kullanıcısından çalıştırmaya izin vermek için start-stop-daemon aracını kullanıyorum.

Bu dtnd arka plan programını başlangıçtan çalıştırmak istiyorum. Bu davranışı elde etmek için, start, stop ve status komutlarını kullanarak dtnd dosyasını "saran" bir init.d betiği oluşturdum.

Çözmek isteyeceğim 2 sorum var:

  1. İnit.d kabuk betiğinden bazı işlemleri canlı tutmanın bir yolu var mı ? Standart / en iyi yöntem uygulaması mıdır?

  2. Süreci sonsuz döngü ile canlı tutmanız önerilir mi? Sanırım bunu respawnbaşarmak için bir komut kullanmak daha iyi . Bu doğru?

respawnKomutun varlığını biliyorum . Bunun ne gerekmez ama aralarında iş akışını anlamıyorum düşünüyorum /etc/init.d/ve /etc/init. Biri bana yardım edebilir mi?

Not I (Ben sadece kullanımına izin var ne sonradan görme inittab yok /etc/init, /etc/init.d, cronolarak ve sistem araçları start-stop-daemon. Ben, yalnızca varsayılan araçları ortalama)

Zaman ayırdığınız için çok teşekkür ederim!


Yanıtlar:


13

Debian sonunda systemd'ye sahip olacak, bu yüzden bunu systemd kullanan bir Linux sisteminde yapmanın yolu budur (ve çoğu zaten yapıyor; dağıtımları değiştirmeyi düşünebilirsiniz).

Systemd hizmeti sizin için otomatik olarak canlı tutabilir; başka alet gerekmez. Bunun Restart=alwaysservis dosyasının [Service]bölümünde ayarlandığından emin olun .

# vi /etc/systemd/system/dtnd.service

[Service]
Restart=always
#...everything else...

Daha karmaşık senaryolar için başka seçenekler de mevcuttur.


2
Gelecek daha esnek seçenekler gösterse de, mevcut ortam / koşullarla ilgileniyor mu? Bir aracın montajı, bir forklift dağıtım değişikliği / yükseltmesine kıyasla en az direnç yolu gibi görünüyor.
ewwhite

@whwhite Değişir. Debian hışıltıdan beri sistemd var, ama varsayılan init değildi. Jessie'nin varsayılanı olmalı. Ve kullanıcımız cevabı kabul ettiğinden, zaten başka bir nedenden dolayı systemd kullandığını (veya kurma iznine sahip olduğunu) düşünüyorum.
Michael Hampton

systemdinit.dsenaryo & taban gibi görünüyor*.service
yurenchen

2
Bunun yerine, doğrudan güvenli kullanımını düzenleme systemctl edit myservice, daha sonra systemctl daemon-reloadve yeniden başlatma MyService.
Pablo A

@PabloBianchi Varolan bir hizmetin birimini geçersiz kılıyorsanız, geçersiz kılma oluşturmak iyidir. OP'nin yaptığı gibi sıfırdan bir birim oluşturuyorsanız, anlamsızdır.
Michael Hampton

3

Sen eklerdiniz /etc/inittabile respawn:

d1:2345:respawn:/path/to/your/first_daemon arg1 arg2
d2:2345:respawn:/path/to/your/second_daemon arg1 arg2

Kirli bir hack, ama geçmişte eski sysv-init sistemlerinde başarılı bir şekilde kullandım.


Ama arka planda çalıştırmak için uually cal setsid () ve fork () daemons değil mi?
symcbean

Teşekkür ederim! Dediğiniz gibi kirli bir kesmek ama işe yarıyor. Neyse ben systemd kullanımını tercih ediyorum. Şimdi onun varlığını biliyorum.
Adrian Antunez

Bu RHEL6 üzerinde çalışmaz. Yeniden doğma yardımcı programı mevcut görünmüyor.
Djidiouf

2

Debian'ın sistemd'e geçmesinin ana nedeni budur.

sysvinit (/etc/init.d), bir hizmetin devre dışı / yanıt vermiyorsa algılayamaz. Bu, artık bir hizmeti işini yapmayacaksa bu hizmetleri izlemeniz ve yükseltmeniz gerektiği anlamına gelir.

muhtemelen yapılacak en kolay şey systemd gibi başka bir daemonhandler'a geçmek (RHEL7'de varsayılan, sonraki debian ve ubuntu lts'de varsayılan olacaktır), uptart (RHEL6, Ubuntu 12.04 ve 14.04'te varsayılan), daemontools ( djb) veya başka bir şey.

bir hizmeti canlı tutma işini yapmak sistemde PITA olacaktır.


1

En iyi uygulama, cinlerinizin en başta DURMADIĞINDAN emin olmaktır.

DJB'nin daemontools'una bir göz atmak isteyebileceğinizden


3
Tabii ki en iyi uygulama, cinlerimin durmamasını sağlamaktır. Ancak apache2, mysql, samba, pulseaudio gibi if-I-stop-wake-me yaklaşımını takip eden birçok uygulama var ... Ben deemontools'u arıyorum ve iyi bir yaklaşım gibi görünüyor. Ne yazık ki, harici araçlar yüklememe izin verilmiyor. Ben bash komut dosyası veya start-stop-daemon ve init.d configs kullanarak yapmak gerekir.
Adrian Antunez

1

Benim için standart yaklaşım, bunun için Monit yardımcı programını kullanmaktır .

Monit gibi bir şey yazdıysanız ve çalıştığından emin olmaya çalışıyorsanız veya oluşturduğunuz daemon'u izlemek için bir şeye ihtiyacınız varsa, açıklamanızdan tam olarak söyleyemem.


1
Merhaba ewwhite, uygulamamın çalıştığından emin olmak zorundayım. Ne yazık ki, harici araçlar yüklememe izin verilmiyor. Ben bash komut dosyası veya start-stop-daemon ve init.d configs kullanarak yapmak gerekir.
Adrian Antunez

2
@ AdriánAntúnez İşinizi yapmanız için gereken araçları kurmanıza izin verilmiyorsa, bu sorunu en kısa sürede çözmelisiniz.
Michael Hampton

@ AdriánAntúnez "Standart" istediniz. Monit oldukça tanınmış / saygın. "En iyisi" istediniz ... Kısıtlamanız daha politik bir şey. Neden yazılım yüklemenize izin verilmiyor?
ewwhite

1
Yapmasını istediğiniz şeyi yaparsa , gereksiz bir araç veya bağımlılık değildir .
ewwhite

1
@ewwhite Üzgünüm, harici araçların bağımlılığından kaçınmak istedim.
Adrian Antunez
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.