java daemon'u systemd ile yapılandır


11

Bu tanımı bir systemdiş için kullanıyorum :

 [Unit]
 Description=Some job

 [Service]
 ExecStart=/usr/local/sbin/somejob
 User=dlt
 Type=forking

 [Install]
 WantedBy=multi-user.target

Komut dosyası şu şekilde adlandırılır (bir tcpip soketini dinleyen ve girdiyi bir dosyaya ekleyen basit bir rutini çağırır):

 #!/bin/sh

 cd /home/user/tmp/testout
 nohup java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar </dev/null >/dev/null &

Sonra systemctl start somejobile çalışan işlem gösterir initkendi ebeveyn olarak:

 user@CANTANDO ~$ ps -u dlt eo pid,ppid,command
   PID  PPID COMMAND
  8718     1 java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar

İşlemden sonra systemctl stop somejobişlem artık gösterilmiyor (ve bağlantı noktası kapalı).

Yani her şey güzel ve züppe görünüyor

Sorum şu: Bu bir java daemon'u çalıştırmak için kabul edilebilir bir çözümsystemd mü, yoksa uyarılar mı var ve bu yüzden bunu başarmak için daha kararlı veya güvenli yollar var mı?

Yanıtlar:


14

İşte bazı küçük değişiklikler:

  1. Bir ağ soketini dinlediğinden, onu bir bağımlılık haline getirin network.target.
  2. nohupgerekli değildir çünkü systemdçalıştırılabilir dosyayı sizin için arka plana çevirir.
  3. Ben ayrı bir kabuk komut dosyası bir overkill olacağını düşünüyorum, bu yüzden sadece hizmet dosyasına birleştirmek.
  4. < /dev/nullSystemd uygun bir standart G / Ç bağlamı ayarladığından yönlendirme ( ve benzeri) gerekmez. Eğer yeniden yönlendirme alırsak Nitekim dışarı hiçbir özel günlüğü mekanizması ile kendi dergide Java programı tarafından standart çıkışa gönderilen şeyi oturum olacaktır systemd gerektiriyordu.
  5. Çağırma kabuğundan ( &) zaman uyumsuz olarak çalıştırılması gerekli veya uygun değildir.
  6. Gerekli belirli bir davranış modeli vardır Type=forkingve dæmon tarafından takip edilmezse işler ters gider. Yani Type=simple(veya Type=notify) için deneyin .

Hizmet dosyası şöyle görünür:

[Unit]
Description=Some job
After=network.target

[Service]
WorkingDirectory=/home/user/tmp/testout
SyslogIdentifier=SocketTest
ExecStart=/bin/sh -c "exec java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar"
User=dlt
Type=simple

[Install]
WantedBy=multi-user.target

Notlar:

  1. javaÇalıştırılacak programın adı olarak kullanamazsınız . systemd PATHyürütülebilir dosyaları aramaz ve verilen çalıştırılabilir dosyanın adı ExecStartmutlak olmalıdır. Eğer yol arama istiyorsanız bir kabuk veya /usr/bin/env. Burada seçiyoruz /bin/sh.
  2. Bu Type=simplekabuk execJava olduğundan, bir alt işlem olarak çalıştırmamalısınız. systemd hizmeti ana işlem aracılığıyla denetler ve bunun üst kabuk işlemi değil Java olması gerekir.
  3. Bu, Java yürütülebilir dosyasını doğrudan çağırmadığından, systemd adı shgünlüğüne hizmet adı olarak koyacaktır . Daha fazla bilgi için bkz. / Usr / bin / env dosyasının systemd günlüklerinde yürütülebilir olarak işaretlenmesini önleme .

Bildiğim kadarıyla, Java uygulamasını Systemd ile çalıştırmanın özel bir uyarısı yok.


1
Bu işe yaramaz. Sorun 1: Bu kabuk değil; yeniden yönlendirme operatörü yoktur. Zaten bu yönlendirmeyi gerçekten istemiyorsun. Sorun 2: ExecStart mutlak yol adları istiyor. Sorun 3: unix.stackexchange.com/questions/229523
JdeBP

Güzel kafa yukarı. Sadece sorun 1'i çözmeyi başarabilirim. Prob 2,3'ü nasıl düzeltmeye başlıyorsunuz?
Yun-Chih Chen

1
Cevabı düzenlenmiş olarak görün.
JdeBP

Burada sh'nin gerekli olduğunu sanmıyorum.
faho

Merhaba @ Yun-ChihCen süreci nasıl durdurursun? ExecStrop neye benziyor? Bir pid dosyası ile birlikte init.d kullanıyordum ama bunu daha kolay buldum. Bu yüzden nasıl durduracağımı bildiğimden emin
black sensei
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.