Jalankan file java jar di server sebagai proses background

105

Saya perlu menjalankan java jar di server untuk berkomunikasi antara dua aplikasi. Saya telah menulis dua skrip shell untuk menjalankannya, tetapi begitu saya memulai skrip itu, saya tidak dapat mematikan / menghentikan proses. Jika saya menekan ctrl+ Catau menutup konsol, server akan mati. Adakah yang bisa membantu saya cara mengubah skrip ini untuk dijalankan sebagai server normal?

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

Jawaban:

242

Anda bisa mencoba ini:

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

Simbol &, mengalihkan program untuk berjalan di latar belakang.

Utilitas nohup membuat perintah yang diteruskan sebagai argumen berjalan di latar belakang bahkan setelah Anda keluar.

Anton Beloglazov
sumber
Terima kasih Anton, saat ini saya menghentikan server dengan mematikan proses id. Saya rasa itu bukan perintah terbaik. Apakah perintah mereka untuk menghentikan server?
Bernad Ali
3
Jawaban singkatnya: itu tergantung pada server. Jawaban panjang: sejauh yang saya tahu, tidak ada cara yang aman untuk menghentikan proses tanpa proses yang mendukung penutupan yang anggun tersebut. Misalnya, jika server web dihentikan oleh sinyal eksternal, selalu ada kemungkinan beberapa permintaan akan hilang. Salah satu cara untuk mengatasi masalah ini adalah dengan mengimplementasikan fungsi terminasi yang anggun di server itu sendiri, misalnya dengan memproses jenis permintaan khusus. Kemudian, server dapat diakhiri dengan mengirimkan permintaan jenis khusus itu. Jika tidak, mematikan proses dengan ID-nya adalah cara yang sederhana.
Anton Beloglazov
1
Penggunaan nohupharus selalu dikombinasikan dengan pengalihan stdout dan stderr secara eksplisit - jika tidak, Anda tidak dapat mengontrol ke mana perginya log, dan berakhir dengan pembuatan yang jelek nohup.outdi direktori mana pun asal skrip ini.
Charles Duffy
@ Anton ketika saya menjalankan skrip (seperti jawaban Anda) dengan SSH EXEC runjar.sh. Itu mulai mengalirkan log di terminal lokal saya dan jika menutup terminal saya, jar saya mati. Bagaimana cara menjalankan jar di latar belakang menggunakan SSH EXEC?
AATHITH RAJENDRAN
47

Systemd yang sekarang berjalan di sebagian besar distro

Langkah 1:

Temukan layanan yang ditentukan pengguna milik saya /usr/lib/systemd/system/

Langkah 2:

Buat file teks dengan nama editor teks favorit Anda whatever_you_want.service

Langkah 3:

Masukkan Template berikut ke filewhatever_you_want.service

[Unit]
Description=webserver Daemon

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

[Install]
WantedBy=multi-user.target

Langkah 4:

Jalankan layanan Anda
sebagai pengguna super

$ 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
mtelesha.dll
sumber
Ini adalah cara modern untuk melakukannya
EarthMind
4
pada gambar ubutnu aws saya harus menginstal systemd kemudian menemukan gambar di / etc / systemd / system /
Robbo_UK
29

Jika Anda menggunakan Ubuntu dan memiliki "Pemula" ( http://upstart.ubuntu.com/ ), Anda dapat mencoba ini:

Membuat /var/init/yourservice.conf

dengan konten berikut

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  

Sekarang Anda dapat mengeluarkan perintah service yourservice startdan service yourservice stop. Anda dapat mengikuti /var/log/yourservice.loguntuk memverifikasi bahwa itu berfungsi.

Jika Anda hanya ingin menjalankan jar dari konsol tanpa memonopoli jendela konsol, Anda dapat melakukan:

java -jar /web/server.jar > /var/log/yourservice.log 2>&1
Strelok
sumber
3
Apakah itu layanan systemd? Pertanyaan ini tidak diberi tag pada linux, dan sangat sedikit distro yang memiliki systemd secara default.
jordanm
1
Saya akan mengubah pertanyaan menjadi mengatakan bahwa ini menggunakan "pemula" yang termasuk dalam ubuntu.
Strelok
1
Saya percaya untuk saran terakhir jika Anda ingin menjalankannya di latar belakang dan cangkangnya dirilis, Anda harus melakukan: java -jar /web/server.jar > /var/log/yourservice.log 2>&1 &
Montaro
Semua pekerjaan sistem secara default berada di direktori berikut: / etc / init / ... Secara default, tidak ada direktori / var / init / di Ubuntu 14.04.
Michael Lafayette
Selain itu, memulai layanan membutuhkan "sudo". sudo service yourservice start
Michael Lafayette
2

Jalankan di latar belakang dan tambahkan log ke file log menggunakan yang berikut ini:

nohup java -jar /web/server.jar > log.log 2>&1 &
KayV
sumber