บริการยังคงอยู่ในสถานะล้มเหลวหลังจากหยุดด้วย systemctl


19

เรามีสคริปต์ systemd อย่างง่ายในการเริ่มต้นเซิร์ฟเวอร์ MineCraft ในรูปแบบการบริการ SO คือ CentOS 7 ที่นี่สคริปต์:

[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

การเริ่มต้นบริการใช้งานได้ดี แต่เมื่อหยุดบริการจะยังคงอยู่ในสถานะที่ล้มเหลว ดู:

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)

ความคิดใด ๆ

ขอบคุณ

คำตอบ:


27

รหัสออก 143 หมายความว่าโปรแกรมได้รับสัญญาณ SIGTERM เพื่อสั่งให้ออก แต่ไม่สามารถจัดการสัญญาณได้อย่างถูกต้อง นี่เป็นเพราะข้อผิดพลาดในการเขียนโปรแกรมเกือบทุกครั้งและเป็นเรื่องธรรมดากับแอปพลิเคชัน Java ทุกประเภท

คุณควรจะระงับสิ่งนี้ได้โดยการเพิ่มรหัสทางออกลงในไฟล์หน่วยเป็นสถานะออก "สำเร็จ":

[Service]
SuccessExitStatus=143

มันได้ผล. ขณะนี้บริการอยู่ในสถานะไม่ได้ใช้งานตามที่คาดไว้
kalise

4
วิธี "เหมาะสม" ในการจัดการสัญญาณด้วยแอปพลิเคชัน Java คืออะไร ที่ใกล้เคียงที่สุดที่ฉันสามารถหาได้คือ hooks shutdown hooks แต่ไม่มีที่ไหนในเอกสารประกอบกล่าวถึง hooks shutdown ที่เปลี่ยนรหัสทางออกของแอปพลิเคชัน
Spoage

@SPoage stackoverflow.com/q/2975248/1068283แต่ดูเหมือนว่า Java จะออกด้วยรหัส 143 เสมอในกรณีนี้แม้ว่าจะมี hook shutdown อยู่ก็ตาม
Michael Hampton

11

เพื่อเติมเต็มคำตอบของ Michael รหัสทางออก 143 เป็นเรื่องปกติที่นี่เป็นวิธีที่ java VM ได้รับสัญญาณ SIGTERM ส่งโดย systemd เพื่อหยุดกระบวนการ สัญญาณ SIGTERM มีค่าตัวเลข 15 (ดูman signal)

ตอนนี้ตามข้อกำหนดของ Posix "สถานะการออกของคำสั่งที่ยกเลิกเพราะได้รับสัญญาณจะต้องรายงานมากกว่า 128" ( http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_08_02 )

Java VM เพิ่ม 128 +15 และคุณจะได้รับรหัสการออกนี้ 143

โค้ดการออกที่ไม่ใช่ศูนย์นี่ทำให้เกิดความรู้สึกเช่นนี้จะช่วยให้เห็นว่าโปรแกรม Java ของคุณออกเพราะสัญญาณภายนอกและคุณจะได้รับโอกาสในการค้นหาว่าสัญญาณใด


ข้อความข้อกำหนด POSIX ที่อ้างถึงดูเหมือนจะระบุว่าเชลล์ควรทำงานอย่างไรและพูดว่า "เชลล์เป็นล่ามภาษาคำสั่ง" Java VM ดูเหมือนจะไม่ใช่สิ่งที่ครอบคลุมโดยสเปคนั้น วิธีที่เชลล์ตีความ Java VM (หรือโปรแกรมอื่น ๆ ) ที่ยกเลิกเนื่องจาก SIGTERM - ว่าควรตั้งรหัสทางออกเป็น 143 - ถูกครอบคลุมโดยสเปค แต่ฉันค่อนข้างแน่ใจว่าไม่มีเชลล์ที่เกี่ยวข้องที่นี่
doshea

คุณถูกที่ข้อมูลจำเพาะของ POSIX นี้จะกำกับที่เชลล์ UNIX แต่ที่นี่ดูเหมือนว่าผู้เขียน JVM ตัดสินใจที่จะใช้โค้ดส่งคืนในแบบเดียวกัน
มนู
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.