Systemctl ile durdurulduktan sonra hizmetler başarısız durumda kalır


19

bir MineCraft sunucusunu hizmet tarzında başlatmak için basit bir systemd betiğimiz var. SO CentOS 7'dir. İşte senaryo:

[Unit]
Description=Minecraft Server
After=syslog.target network.target

[Service]
Type=simple
WorkingDirectory=/root/Minecraft
ExecStart=/bin/java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui
Restart=on-failure

[Install]
WantedBy=multi-user.target

Hizmetin başlatılması iyi çalışıyor ancak dururken hizmet başarısız durumda kalıyor. Görmek:

systemctl status minecraftd.service
minecraftd.service - Minecraft Server
   Loaded: loaded (/usr/lib/systemd/system/minecraftd.service; disabled)
   Active: active (running) since Mon 2015-06-01 16:00:12 UTC; 18s ago
 Main PID: 20975 (java)
   CGroup: /system.slice/minecraftd.service
           └─20975 /bin/java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui
systemctl stop minecraftd.service
systemctl status minecraftd.service
minecraftd.service - Minecraft Server
   Loaded: loaded (/usr/lib/systemd/system/minecraftd.service; disabled)
   Active: failed (Result: exit-code) since Mon 2015-06-01 16:01:37 UTC; 3s ago
  Process: 20975 ExecStart=/bin/java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui (code=exited, status=143)
 Main PID: 20975 (code=exited, status=143)

Herhangi bir fikir?

Teşekkürler

Yanıtlar:


27

Çıkış kodu 143, programın çıkmasını bildirmek için bir SIGTERM sinyali aldığını, ancak sinyali düzgün işlemediğini gösterir. Bu neredeyse her zaman programlama hatalarından kaynaklanır ve her tür Java uygulamasında oldukça yaygındır.

Çıkış kodunu birim dosyasına "başarılı" çıkış durumu olarak ekleyerek bunu bastırabilirsiniz:

[Service]
SuccessExitStatus=143

İşe yarıyor. Şimdi hizmet beklendiği gibi etkin değil.
kalise

4
Bir Java uygulamasıyla sinyali işlemek için "uygun" yol ne olurdu? Bulabildiğim en yakın kapatma kancaları olurdu, ancak belgelerin hiçbir yerinde kapatma kancalarının uygulamanın çıkış kodunu değiştirdiğini söylemiyor.
Salı

@SPoage stackoverflow.com/q/2975248/1068283 Ancak, görünüşe göre, bir kapatma kancası olsa bile, Java her zaman 143 koduyla çıkar.
Michael Hampton

11

Michael'ın cevabını tamamlamak için burada çıkış kodu 143 normaldir, java VM'nin bir SIGTERM sinyali alması, sistemi durdurmak için sistemd tarafından gönderilmesinin yolu budur. SIGTERM sinyalinin sayısal değeri 15'dir (bkz. man signal).

Şimdi Posix spesifikasyonuna göre, "Bir sinyal aldığı için sona eren bir komutun çıkış durumu 128'den büyük olarak rapor edilecektir". ( http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_08_02 )

Burada Java VM 128 + 15 ekler ve 143 çıkış kodunu alırsınız.

Bu sıfır olmayan çıkış kodu, duyu yapar, çünkü bu, java programınızın harici bir sinyal nedeniyle çıktığını ve hangi sinyali bulduğunuzu görmenizi sağlar.


Başvurulan POSIX spesifikasyon metni bir kabuğun nasıl davranması gerektiğini belirtiyor gibi görünüyor ve "Kabuk bir komut dili yorumlayıcısıdır" diyor. Bir Java VM, bu spesifikasyonun kapsadığı bir şey gibi görünmemektedir. Bir kabuk SIGTERM nedeniyle sonlanan bir Java VM'yi (veya başka bir programı) nasıl yorumluyor - çıkış kodunu 143 olarak ayarlamalıdır - kesinlikle şartname kapsamındadır, ancak burada bir kabuk olmadığından eminim.
doshea

Bu POSIX spesifikasyonunun UNIX kabuğuna yönlendirildiği konusunda haklısınız, ancak burada JVM yazarları dönüş kodlarını aynı şekilde uygulamaya karar verdiler.
Manu
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.