Ubuntu başladığında otomatik olarak bir servis nasıl başlatılır?


31

Ubuntu 12.04 kullanıyorum ve sistem normal şekilde başlatıldığında bir servis başlatmak istiyorum.

'Hizmet' olarak bazı kodları anlıyorum, örneğin cd my_directory; my_command -host 0.0.0.0 -port 1234 -arg x komut satırından başlatılmış gibi çalışıyor olmalıdır. Normal kullanıcı olarak başlatılacak hizmetler vardır, ancak aynı zamanda root olarak başlatılacak hizmetler de vardır (aslında, hizmetlerin kullanıcı düzeyinde çalıştırılması gerekli değildir).

Ayrıca bir 'hizmet' durduğunda davranışı yapılandırmam gerekiyor. Benim durumumda, aynı argümanla belirtilen dizinde yeniden başlatılmalarını istiyorum.

Tüm servisler sistem normal şekilde başlatıldığında, yani güç düğmesine basıldığında otomatik olarak başlatılmalıdır. Başka bir işlem yapılması gerekmez.

İnternette yayılmış bazı belgeler var, ama hepsi beni şaşırtıyor. Onlar hakkında konuşmak init, init.d, rc.dama mesela sonradan görme kullanarak bir hizmet olarak kolayca basit bir-to-takip adım-adım talimat görmedim. Bu kolaysa, bu adımların burada verilip verilmediğini takdir ediyorum.

Yanıtlar:


33

Ubuntu başladığında otomatik olarak başlatılacak bir iş oluşturmak için burada verilen örneği kullanın . Yazılı örnek olarak, /etc/init/testservice.confsudo ile aşağıdaki dosyayı oluşturduğunuzu varsayalım :

# testservice - test service job file

description "my service description"
author "Me <myself@i.com>"

# Stanzas
#
# Stanzas control when and how a process is started and stopped
# See a list of stanzas here: http://upstart.ubuntu.com/wiki/Stanzas

# When to start the service
start on runlevel [2345]

# When to stop the service
stop on runlevel [016]

# Automatically restart process if crashed
respawn

# Essentially lets upstart know the process will detach itself to the background
# This option does not seem to be of great importance, so it does not need to be set.
#expect fork

# Specify working directory
chdir /home/user/testcode

# Specify the process/command to start, e.g.
exec python mycommand.py arg1 arg2

İşlemi 'manuel olarak' başlatmak veya durdurmak için

sudo start testservice
sudo stop testservice

İş kontrol komutlarına bakın .


Hizmeti başlatmak için "başlatılmış dağ başlat" gerekiyordu.
mart

23

Tamam, Alex, nokta Linux tüm kullanıcı alanı süreçleri ile başladı olmasıdır initçalıştırın kimin pid Örneğin 1'dir, sürecin pstreekimin kökü init edilir senin süreçlerin ağacı görmek için .. birkaç versiyonu vardır initsüreç uygulanması günümüzde en dikkat çekici

  • sysVinit (klasik init, hala eski Debian dahil olmak üzere bazı dağıtımlar tarafından kullanılıyor)
  • Daha eski Ubuntu ve bazı RHEL (Red Hat) ve daha eski Fedora versiyonları tarafından kullanılan başlatma başlangıcı
  • systemd init, modern Fedora, Ubuntu, Debian, RHEL, SUSE versiyonları tarafından kullanılmaktadır.

Geleneksel olarak, Unix'ler, inix olarak adlandırılan init uygulamasını , Unix'in https://ru.wikipedia.org/wiki/UNIX_System_V versiyonunun sysVinitadıyla kullanır . Çok etkilidir ve diğer girdiler geriye uyumludur.

Temel olarak, sysVinit ilk önce /etc/inittabdosyayı okur , hangi runlevel'in çalıştırılacağına karar verir ve script'e /etc/init.d/rcinit betiklerini çalıştırmasını söyler . Bir çok kullanıcılı çalışma seviyesi, normal olarak, çizme genellikle • Örneğin, Ubuntu 2 çalışma seviyesi , /etc/init.d/rcyürütülüyor komut başlatır /etc/rc2.d. Buradaki dosyalar komut dosyalarına yalnızca sembolik bağlanırken, komut dosyaları kendi /etc/init.ddizininde saklanır . /etc/rc*.dDizinlerdeki bu sembolik bağların isimleri aşağıdaki gibidir. Söyleyin, aşağıdaki komut dosyalarını aldık /etc/rc2.d:

$ls /etc/rc2.d
S16rsyslog
S17apache2
K02network-manager

Bu, runlevel 2 init işlemine geçişte ilk önce network-managerişlemleri öldürür , komut dosyasının ismi ile başlar K- K02network-managerve sonra isimleri ile başlayan işlemleri başlatır S. İki basamak sonra Sveya Ksırasını belirler 00'dan 99'a sayıdır, süreçler içinde başlatılır. Örneğin rsyslogdaha önce başlatılır apache2, 16 mantıklı az 17 (çünkü, sen apache rsyslog günlüğe kaydetme kapasitesine güvenmek istiyorum çünkü , bu nedenle ilk önce rsyslog başlatılmalıdır). Komut dosyaları, sırayla çalışan kabuk komutlarıdır #!/bin/sh.

Yani, temelde sysvinit tarzında başlangıçta bir programı başlatmak için, kendi el yazısı yazmak (herhangi bir örnekten onu kopyalamaya karşı yapıştırarak, içeri var /etc/init.d), koyun /etc/init.dve, örneğin makul bir ad altında buna bir sembolik oluşturmak S99mytrojaniçinde /etc/rc2.d. İşte /etc/init.d http://docs.oracle.com/cd/E19683-01/806-4073/6jd67r96g/index.html adresindeki tipik sysVinit betiklerinin bir açıklaması

Şimdi, Ubuntu adamları init'ten ek işlevsellik istemelerine karar verdi. Hızlı başlatılan bir işletim sistemi istediler, bu yüzden senaryolarının paralel olarak yürütülmesini istediler; ölü işlemlerin otomatik olarak yeniden başlatılmasını istediler; işlemlerin birbirlerini açık bir şekilde olaylarla çağırmasını istediler (böylece apache "syslog started" olayı tarafından çalıştırılıyor, syslog da "dosya sistemleri monte edilmiş" olayı vb. tarafından çalıştırılıyor, bu yüzden bazı sayılar yerine olaylarımız var 00 -99). Böylece, Upstart'ı başlattılar ve işte böyle çalışıyor. Başlangıcı initscripts /etc/initdizine konur (karıştırmayın /etc/init.d). Upstart genellikle çalışır /etc/init.d/rc, bu yüzden sysVinit scriptlerinizi normal şekilde çalıştırır. Ancak betiğinizin çıkışta yeniden çizilmesini istiyorsanız - Upstart olayları tam size göre.

Senaryomun çalışıp çalışmadığını kontrol edemesem de, sanırım amaçlarınız için aşağıdaki /etc/init/mytrojan.confsenaryoyu yazmalısınız :

start on runlevel [02]
respawn
exec mytrojan --argument X 

Ancak, bağımlılıklara, en azından dosya sistemlerine ve ağa ihtiyacınız varsa, bunun start on runlevel [02]gibi bir şeyle değiştirmek mantıklı olabilir :

start on (local-filesystems and net-device-up IFACE!=lo)

UYARI: Bunun doğruluğunu kontrol etmedim, çünkü yapamam. Özellikle ağ bağlantınız kurulduktan sonra script'in nasıl başlatılacağından emin değilim ( bu sürümü kullandım ). "Ağda başlatma" için Google'ı deneyin.


1
Bu, Linux'ta başlatılan işlemin tarihçesi hakkında çok güzel bir genel bakış ancak soruya cevap vermiyor. Hala bir başlangıç ​​sürecini nasıl yaratacağımı bilmiyorum. Ayrıca sadece onu kullanmak istiyorum, nasıl çalıştığını her küçük parçayı anlayamıyorum. Ben sadece basit ve kullanımı kolay bir çalışma örneğine sahip olmak istedim, ubuntu'nun start-up ile otomatik olarak yeniden başlatılması ve yeniden başlatılması için bir sürecin nasıl yaratılacağına dair.
Alex,

@Alex: Bir örnek script ile güncellendi. Not, senaryomun çok yanlış olabileceğini unutmayın. Bunu alexreisner.com/code/upstart ruhu içinde yaptım .
Boris Burkov

1
Çünkü bu, şimdiye kadar okuduğum en iyi cevaplardan biri.
user1301428
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.