รันไฟล์ java jar บนเซิร์ฟเวอร์เป็นกระบวนการเบื้องหลัง


105

ฉันต้องการเรียกใช้ java jar ในเซิร์ฟเวอร์เพื่อสื่อสารระหว่างสองแอปพลิเคชัน ฉันได้เขียนเชลล์สคริปต์สองตัวเพื่อเรียกใช้ แต่เมื่อฉันเริ่มต้นสคริปต์นั้นฉันไม่สามารถปิด / ยุติกระบวนการได้ ถ้าฉันกดctrl+ Cหรือปิดคอนโซลเซิร์ฟเวอร์จะปิด ใครช่วยแก้ไขสคริปต์นี้ให้ทำงานเป็นเซิร์ฟเวอร์ปกติได้ไหม

 #!/bin/sh
java -jar /web/server.jar
echo $! 
#> startupApp.pid

คำตอบ:


243

คุณสามารถลองสิ่งนี้:

#!/bin/sh
nohup java -jar /web/server.jar &

เครื่องหมาย & สลับโปรแกรมให้ทำงานในพื้นหลัง

ยูทิลิตี้ nohup ทำให้คำสั่งส่งผ่านเมื่ออาร์กิวเมนต์ทำงานอยู่เบื้องหลังแม้ว่าคุณจะออกจากระบบแล้วก็ตาม


ขอบคุณ Anton โดยสิ้นเชิงฉันหยุดเซิร์ฟเวอร์โดยการฆ่า id กระบวนการฉันไม่คิดว่ามันเป็นแนวทางปฏิบัติที่ดีที่สุดพวกเขามีคำสั่งให้หยุดเซิร์ฟเวอร์หรือไม่
Bernad Ali

3
คำตอบสั้น ๆ : ขึ้นอยู่กับเซิร์ฟเวอร์ คำตอบแบบยาว: เท่าที่ฉันรู้ไม่มีวิธีใดที่ปลอดภัยในการปิดกระบวนการหากไม่มีกระบวนการที่รองรับการปิดระบบอย่างสง่างามเช่นนี้ ตัวอย่างเช่นหากเป็นเว็บเซิร์ฟเวอร์ที่ถูกยุติการใช้งานโดยสัญญาณภายนอกมีความเป็นไปได้เสมอที่คำขอบางรายการจะสูญหาย วิธีหนึ่งในการแก้ปัญหานี้คือการใช้ฟังก์ชันการยุติที่สง่างามในเซิร์ฟเวอร์เองเช่นโดยการประมวลผลคำขอประเภทพิเศษ จากนั้นเซิร์ฟเวอร์สามารถยุติได้โดยการส่งคำขอพิเศษดังกล่าว มิฉะนั้นการฆ่ากระบวนการด้วย ID เป็นวิธีง่ายๆ
Anton Beloglazov

1
การใช้nohupควรรวมกับการเปลี่ยนเส้นทาง stdout และ stderr อย่างชัดเจนเสมอมิฉะนั้นคุณจะไม่สามารถควบคุมได้ว่าบันทึกจะไปที่ใดและจบลงด้วยการnohup.outสร้างที่น่าเกลียดในไดเร็กทอรีใดก็ตามที่สคริปต์นี้ถูกเรียกใช้
Charles Duffy

@Anton เมื่อฉันเรียกใช้สคริปต์ (เช่นเดียวกับคำตอบของคุณ) ด้วย SSH EXEC runjar.sh มันเริ่มสตรีมบันทึกในเทอร์มินัลในเครื่องของฉันและถ้าปิดเทอร์มินัลโถของฉันจะถูกฆ่า ฉันจะเรียกใช้ jar ในพื้นหลังโดยใช้ SSH EXEC ได้อย่างไร
AATHITH RAJENDRAN

49

Systemdซึ่งตอนนี้ทำงานใน distros ส่วนใหญ่

ขั้นตอนที่ 1:

ค้นหาบริการที่กำหนดโดยผู้ใช้ของคุณของฉันอยู่ที่ /usr/lib/systemd/system/

ขั้นตอนที่ 2:

สร้างไฟล์ข้อความด้วยโปรแกรมแก้ไขข้อความที่คุณชื่นชอบ whatever_you_want.service

ขั้นตอนที่ 3:

ใส่เทมเพลตต่อไปนี้ ลงในไฟล์whatever_you_want.service

[Unit]
Description=webserver Daemon

[Service]
ExecStart=/usr/bin/java -jar /web/server.jar
User=user

[Install]
WantedBy=multi-user.target

ขั้นตอนที่ 4:

เรียกใช้บริการของคุณ
ในฐานะผู้ใช้ขั้นสูง

$ systemctl start whatever_you_want.service # starts the service
$ systemctl enable whatever_you_want.service # auto starts the service
$ systemctl disable whatever_you_want.service # stops autostart
$ systemctl stop whatever_you_want.service # stops the service
$ systemctl restart whatever_you_want.service # restarts the service

นี่คือวิธีการที่ทันสมัยในการทำ
EarthMind

4
บนอิมเมจ ubutnu aws ฉันต้องติดตั้ง systemd จากนั้นพบภาพใน / etc / systemd / system /
Robbo_UK

29

หากคุณใช้ Ubuntu และมี "Upstart" ( http://upstart.ubuntu.com/ ) คุณสามารถลองสิ่งนี้:

สร้าง /var/init/yourservice.conf

โดยมีเนื้อหาดังต่อไปนี้

description "Your Java Service"  
author "You"  

start on runlevel [3]  
stop on shutdown  

expect fork  

script     
    cd /web 
    java -jar server.jar >/var/log/yourservice.log 2>&1  
    emit yourservice_running  
end script  

ตอนนี้คุณสามารถออกคำสั่งservice yourservice startand service yourservice stopคุณสามารถ/var/log/yourservice.logตรวจสอบว่าใช้งานได้หรือไม่

หากคุณเพียงแค่ต้องการเรียกใช้ jar ของคุณจากคอนโซลโดยไม่ต้องใช้งานหน้าต่างคอนโซลคุณสามารถทำได้:

java -jar /web/server.jar > /var/log/yourservice.log 2>&1

3
เป็นบริการที่เป็นระบบหรือไม่? คำถามนี้ไม่ได้ติดแท็ก linux และมี distros น้อยมากที่ systemd โดยค่าเริ่มต้น
jordanm

1
ฉันจะแก้ไขคำถามเพื่อบอกว่านี่คือการใช้ "upstart" ซึ่งรวมอยู่ใน ubuntu
Strelok

1
ฉันเชื่อว่าสำหรับคำแนะนำสุดท้ายหากคุณต้องการให้มันทำงานในพื้นหลังและปล่อยเชลล์ออกมาคุณควรทำ: java -jar /web/server.jar > /var/log/yourservice.log 2>&1 &
มอนทาโร่

งานระบบทั้งหมดตามค่าเริ่มต้นจะอยู่ในไดเร็กทอรีต่อไปนี้: / etc / init / ... โดยค่าเริ่มต้นไม่มีไดเร็กทอรี / var / init / ใน Ubuntu 14.04
Michael Lafayette

นอกจากนี้การเริ่มบริการต้องใช้ "sudo" sudo service yourservice เริ่ม
Michael Lafayette

3

ทำงานในพื้นหลังและเพิ่มบันทึกลงในไฟล์บันทึกโดยใช้สิ่งต่อไปนี้:

nohup java -jar /web/server.jar > log.log 2>&1 &
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.