บริการยังคงอยู่ในสถานะล้มเหลวหลังจากหยุดด้วย 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.