2015-04-08 36 views
10

Bu, systemd'yi ilk defa kullanıyorum ve bir şey hakkında biraz emin değilim. Ben (tomcat altında çalışan geoserver için) kurdum bir hizmet varsystemd service başlangıç ​​sorunu

:

[Unit] 
Description=Geoserver 
After=network.target 

[Service] 
Type=oneshot 
ExecStart=/usr/local/geoserver/bin/startup-optis.sh 
ExecStop=/usr/local/geoserver/bin/shutdown-optis.sh 
User=geoserver 

[Install] 
WantedBy=multi-user.target 

senaryoyu başlatmak java/tomcat'ı çalıştırmak için bir exec yapar. komut satırında hizmeti başlatma çalışması için görünür:

sudo systemctl start geoserver 

komut I-c ctrl kadar, bu benim için doğru görünmüyor dönmez Ancak. Ancak java süreci hala devam ediyor ve normal çalışıyor. Bunu test etmek için kutuyu yeniden başlatmakta isteksizim, çünkü bu durum init sırasında sorunlara yol açacak ve uzaktaki bir makine olacak ve birisinin onu ele alması için bir acı olacaktır.

cevap

16

Sen "Servis" bölümünde doğru "Type" ayarlamalısınız:

bu hizmet birimi için işlem başlatma türünü yapılandırır

[Service] 
... 
Type=simple 
... 

yazın. Basit, forking, olanlar, dbus, bildirmek veya boşta.

(ne Tipi = ne de BusName = ama ExecStart = belirtilirse varsayılan) basit olarak ayarlanırsa

, bu süreç ExecStart ile yapılandırılmış olması beklenir = hizmetin ana süreçtir. Bu modda, numaralı işlemin sistemdeki diğer işlemlere işlevsellik sunması durumunda, haberleşme kanallarının sistem başlatılmadan önce kurulması gerekir (örn. Sistemd ile kurulan soketler, soket aktivasyonu yoluyla), sistemd hemen devam edecektir. takip birimlerinin başlatılması.

Forking olarak ayarlanmışsa, ExecStart = ile yapılandırılan işlemin, başlatılmasının bir parçası olarak fork() öğesini çağırması beklenir. Başlatma tamamlandığında ve iletişim kanallarının tümü ayarlandığında, üst işleminin çıkması beklenir. Çocuk, ana daemon işlemi olarak çalışmaya devam ediyor. Bu geleneksel UNIX'in davranışlarının davranışıdır. Bu ayar kullanılırsa, PIDFile = seçeneğini de kullanmanız önerilir; böylece sistemd, daemonun ana işlemini tanımlayabilir. systemd, ana işlemden çıkar çıkmaz izleme birimlerinin başlatılmasıyla devam edecektir.

Olanakların davranışı basittir; bununla birlikte, sistemd izleme birimleri başlamadan önce işleminin çıkması beklenmektedir. RemainAfterExit = bu servis türü için özellikle kullanışlıdır. Bu , Type = veya ExecStart = belirtilmemişse, belirtilen varsayılan değerdir.

Dbus'ın davranışı basittir; ancak, daemonun BusName = tarafından yapılandırıldığı gibi D-Bus veriyolunda bir isim alması beklenir. sistemd D-Bus veri yolu isminin alınmasından sonra takip üniteleri ile devam edecektir. Bu seçenek olan servis birimleri, dbus.socket ünitesine dolaylı olarak bağımlılıklar kazandırır. BusName = belirtilirse, bu türü varsayılan değerdir.

Bildirim davranışı basittir; ancak, daemonun, sd_notify (3) veya başlatmayı tamamladığında bir eşdeğer çağrı yoluyla bir bildirim mesajı göndermesi beklenir. systemd, gönderilerek, bu bildirim mesajı gönderildikten sonra devam edecektir. Bu seçenek kullanılırsa, systemd tarafından sağlanan bildirim soketine erişim açmak için NotifyAccess = (aşağıya bakınız) olarak ayarlanmalıdır. NotifyAccess = ayarlanmamışsa, örtük olarak ana olarak ayarlanır. şu anda Type = notify öğesinin PrivateNetwork = yes ile birlikte kullanıldığında çalışmayacağını unutmayın.

Boşta davranışın davranışı basittir; ancak, hizmet ikili öğesinin gerçek yürütme tüm işlerin gönderilinceye kadar ertelenir. Bu , kabuk servislerinin çıkışının konsolda durum çıkışı ile araya girmesini önlemek için kullanılabilir.

+0

Çok teşekkürler, işe yaradı. Bunu denediğimi sandım (ve diğer birçok permütasyon), belki yeniden yüklemeyi unutmuşum. – vickirk