Java jar dosyasını bir sunucuda arka plan işlemi olarak çalıştırın


105

İki uygulama arasında iletişim kurmak için sunucuda bir java jar çalıştırmam gerekiyor. Çalıştırmak için iki kabuk komut dosyası yazdım, ancak bu komut dosyasını başlattıktan sonra işlemi kapatamıyorum / sonlandıramıyorum. ctrl+ Tuşuna basarsam Cveya konsolu kapatırsam, sunucu kapanacak. Bu komut dosyasını normal bir sunucu olarak çalışacak şekilde değiştirmeme yardımcı olabilir mi?

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

Yanıtlar:


242

Bunu deneyebilirsiniz:

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

& Sembolü, programı arka planda çalışacak şekilde değiştirir.

Nohup yardımcı programı, oturumu kapattıktan sonra bile komutu arka planda çalışan bir argüman olarak geçirir.


Teşekkürler Anton, şu anda işlem kimliğini öldürerek sunucuyu durduruyorum. Bunun en iyi uygulama olduğunu düşünmüyorum. Sunucuyu durdurmak için komut mu?
Bernad Ali

3
Kısa cevap: sunucuya bağlıdır. Uzun cevap: Bildiğim kadarıyla, bu tür zarif kapatmaları destekleyen süreç olmadan bir süreci kapatmanın güvenli bir yolu yoktur. Örneğin, harici bir sinyalle sonlandırılan bir web sunucusuysa, her zaman bazı isteklerin kaybolma olasılığı vardır. Bu sorunu çözmenin bir yolu, örneğin özel bir tür istek işleyerek, sunucunun kendisinde zarif bir sonlandırma işlevi uygulamaktır. Daha sonra, sunucu bu türden bir istek gönderilerek sonlandırılabilir. Aksi takdirde, işlemi kimliğine göre öldürmek basit bir yoldur.
Anton Beloglazov

1
Kullanımı nohupher zaman stdout ve stderr'i açıkça yeniden yönlendirmeyle birleştirilmelidir - aksi takdirde, günlüklerin nereye gittiğini kontrol edemezsiniz ve nohup.outbu komut dosyasının hangi dizinden çağrıldığı dizinde çirkin bir yaratma ile sonuçlanırsınız .
Charles Duffy

@Anton, SSH EXEC runjar.sh ile bir komut dosyası çalıştırdığımda (tıpkı cevabınız gibi). Yerel terminalimdeki günlükleri yayınlamaya başladı ve terminalim kapatılırsa kavanozum ölüyor. SSH EXEC kullanarak arka planda nasıl jar çalıştırabilirim?
AATHITH RAJENDRAN

48

Artık dağıtımların çoğunda çalışan Systemd

Aşama 1:

Benim kullanıcı tanımlı hizmetlerinizi bulun /usr/lib/systemd/system/

Adım 2:

Favori metin düzenleyicinizin adını taşıyan bir metin dosyası oluşturun whatever_you_want.service

Aşama 3:

Aşağıdaki Şablonu dosyaya koyun 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. Adım:

Hizmetinizi süper kullanıcı olarak çalıştırın

$ 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

Bunu yapmanın modern yolu bu
EarthMind

4
aws ubutnu görüntüsünde systemd'yi kurmam gerekti ve sonra görüntüyü / etc / systemd / system / içinde
buldum

29

Ubuntu kullanıyorsanız ve "Upstart" ( http://upstart.ubuntu.com/ ) kullanıyorsanız, şunu deneyebilirsiniz:

Oluşturmak /var/init/yourservice.conf

aşağıdaki içerikle

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  

Şimdi service yourservice startveservice yourservice stop komutlarını . Çalıştığını /var/log/yourservice.logdoğrulamak için kuyruk atabilirsiniz .

Jar'ınızı konsol penceresini zorlamadan konsoldan çalıştırmak istiyorsanız, şunları yapabilirsiniz:

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

3
Bu bir sistem hizmeti mi? Bu soru linux etiketlenmemiştir ve çok az sayıda dağıtımda varsayılan olarak systemd vardır.
jordanm

1
Soruyu, bunun ubuntu'da bulunan "upstart" kullandığını söyleyecek şekilde değiştireceğim.
Strelok

1
Son tavsiyem için inanıyorum ki, arka planda çalışmasını istiyorsanız ve kabuk serbest bırakılırsa, yapmanız gerekenler: java -jar /web/server.jar > /var/log/yourservice.log 2>&1 &
Montaro

Tüm sistem işleri varsayılan olarak aşağıdaki dizinde bulunur: / etc / init / ... Varsayılan olarak, Ubuntu 14.04'te / var / init / dizini yoktur.
Michael Lafayette

Ayrıca, bir hizmetin başlatılması "sudo" gerektirir. sudo service yourservice start
Michael Lafayette

2

Arka planda çalıştırın ve aşağıdakileri kullanarak günlük dosyasına günlük ekleyin:

nohup java -jar /web/server.jar > log.log 2>&1 &
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.