Layanan tetap dalam kondisi gagal setelah dihentikan dengan systemctl

19

kami memiliki skrip systemd sederhana untuk memulai server MineCraft dengan cara layanan. SO adalah CentOS 7. Berikut skripnya:

[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

Memulai layanan berfungsi dengan baik tetapi ketika berhenti, layanan tetap dalam kondisi gagal. Lihat:

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)

Ada ide?

Terima kasih

kalise
sumber

Jawaban:

27

Kode keluar 143 berarti program menerima sinyal SIGTERM untuk memerintahkannya keluar, tetapi tidak menangani sinyal dengan benar. Ini hampir selalu karena kesalahan pemrograman, dan sangat umum dengan aplikasi Java dari semua jenis.

Anda harus dapat menekan ini dengan menambahkan kode keluar ke file unit sebagai status keluar "sukses":

[Service]
SuccessExitStatus=143
Michael Hampton
sumber
Berhasil. Sekarang layanan dalam status tidak aktif, seperti yang diharapkan.
kalise
4
Apa cara "tepat" untuk menangani sinyal dengan aplikasi Java? Yang paling dekat yang bisa saya temukan adalah hook shutdown, tetapi tidak ada dalam dokumentasi yang menyebutkan bahwa shutdown hooks mengubah kode keluar aplikasi.
SPoage
@SPoage stackoverflow.com/q/2975248/1068283 Tapi, tampaknya, Java selalu keluar dengan kode 143 dalam kasus ini, bahkan jika ada kait shutdown.
Michael Hampton
10

Untuk melengkapi jawaban Michael, kode keluar 143 adalah normal di sini, itu adalah cara bahwa java VM menerima sinyal SIGTERM, kirim oleh systemd untuk menghentikan proses. Sinyal SIGTERM memiliki nilai numerik 15 (lihat man signal).

Sekarang menurut spesifikasi Posix, "Status keluar dari perintah yang diakhiri karena menerima sinyal harus dilaporkan lebih besar dari 128". ( http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_08_02 )

Di sini Java VM menambahkan 128 + 15 dan Anda mendapatkan kode keluar dari 143.

Kode keluar non nol di sini masuk akal, karena ini memungkinkan untuk melihat bahwa program java Anda keluar karena sinyal eksternal, dan Anda mendapatkan kesempatan untuk mengetahui sinyal mana.

Manu
sumber
Teks spesifikasi POSIX yang direferensikan tampaknya menentukan bagaimana shell seharusnya berperilaku dan mengatakan "Shell adalah penerjemah bahasa perintah." VM Java tampaknya bukan sesuatu yang dicakup oleh spesifikasi itu. Bagaimana shell mengartikan Java VM (atau program lain) yang diakhiri karena SIGTERM - bahwa ia harus menetapkan kode keluar ke 143 - tentu saja dicakup oleh spesifikasi, tetapi saya cukup yakin tidak ada shell yang terlibat di sini.
doshea
Anda benar karena spesifikasi POSIX ini diarahkan pada shell UNIX, tetapi di sini sepertinya penulis JVM memutuskan untuk mengimplementasikan kode pengembalian mereka dengan cara yang sama.
Manu