İşlem java hala öldürülüyor


11

Üniversite sunucularımda bir java programı çalıştırmam gerekiyor. Uzaktan sunucuları üzerinden ssh ile giriş yapıyorum

Yani nohup'ı şu şekilde kullandım:

nohup java -jar project.jar &

Ancak çıkış yapıp terminali kapattığımda sunucuya tekrar giriş yaptığımda işlemim eksik / öldürüldü.


Yönlendirme deneyin stdoutve stderrbazı dosyalara - kapalı terminali için yazma açmaya çalışırken süreç SIGHUP dışındaki sinyal tarafından öldürüldü edilebilir stdout/ ' stderr. Örneğin >/dev/null 2>&1, &iş işaretinden önce komutunuza ekleyin .
Boris Burkov

1
@Bob ile gerekli olmamalıdır nohup- çoğu uygulama bunu varsayılan olarak yapar, ancak stdinörneğin yeniden yönlendirmek gerekebilir </dev/null.
Graeme

Yanıtlar:


14

nohupsadece programı bağışıklık SIGHUPve SIGQUITsinyal verme. Modern kabuk, oturumunuzdan çıktığınızda başka sinyaller gönderebilir, bu nedenle programınızın öldürülmediği, hatta altında çalıştığının garantisi yoktur nohup.

Daha iyi bir çözüm kullanmak tmuxveya screenveya kullanıyorsanız bash, deneyebilirsiniz:

$ java -jar project.jar &
$ disown

Kullanıyorsanız disownmanuel olarak yönlendirmeniz gerekir, örneğin ekleyin</dev/null &>/dev/null
Graeme

@Graeme: Sanırım artık kabukla çalışmazsak (sadece command ve exit komutunu çalıştırırsak), yönlendirmeye gerek yoktur.
cuonglm

Deneyin ssh localhost 'sleep 10m & disown'. bashçıkmayacak.
Graeme

Tamam gibi görünüyor sshterminal bağlı programlar varsa çıkmaz. Bununla birlikte, etkileşimli olarak çalıştırırsanız yukarıdaki sorun yoktur.
Graeme

Linux (GNU coreutils ve busybox) ve BSD uygulamaları nohupkomutu emre bağışık SIGQUITdeğil, sadece SIGHUP. Bu açıkça standarda aykırı olacaktır ve AFAIK sadece (?) Bazı Solaris sürümlerinde olabilir.
mosvy

13

(Kronik olarak işlevsiz) yerine başka bir seçenek nohup:

setsid java -jar project.jar </dev/zero &>/dev/null &

Bu, süreci etkili bir şekilde "arka plan programı" haline getirir. Şimdi init'e aittir, bu yüzden asla HUP'lu olmaz, G / Ç akışları güvenlidir ve arka plana çatallanmıştır.

Daha man setsidfazla bilgi için bakınız . screenVeya tmux, aksine , bu sahiplik iddia eden ve çalışmaya devam eden bir program değildir. Sadece kendi süreç grubunda bir program başlatır .


Nohup neden işlevsiz?
cpugeniusmv

@cpugeniusmv Bir şey için iyi olduğuna eminim, ancak, genellikle önerilen bir amaç için güvenilir bulamadım, bir yere giriş yapma, bir işlem başlatma ve çıkış yapma (OP gibi). Sanırım bu yanlış kullanılabilirdi ve belki de setsidbu şekilde biraz daha aptalca bir kanıt. Nohup tarafından ima edilen bir adımı atlar (işlemin init tarafından yetim olarak yeniden ele alınması). nohupdaha sonra işi ön plana almak istiyorsanız daha esnek olur.
goldilocks

@ TAFKA'goldilocks 'Bence sorun stdin, stdout ve stderr ile uğraşıyor. Nohup ana işi oldukça iyi yapıyor ve süreci SIGHUP'tan koruyor. Ancak akışlarda yanlış gidebilecek birçok şey var - veya çok daha kötüsü, arabellek boyutlarına bağlı olarak bazen yanlış gidiyor. Ben diyorum ki nohup yanlış değil, nohup'un ne yaptığı beklentisi
Volker Siegel


-2

Nohup'ınızı STDOUT ve STDERR yönlendirmesiyle null değerine getirmeyi deneyin:

nohup java -jar project.jar 2>&1 &

1
Yalnızca stderr'ı stdout'a yönlendiriyorsunuz, bu da nohup'un nasıl çalıştığı hakkında hiçbir şeyi değiştirmiyor (her ikisini de yönlendiriyor nohup.out).
Gilles 'SO- kötü olmayı kes'

1
-1, bence demek istedin nohup java -jar project.jar 2>/dev/null &ama ne yaptığını bilmiyorsun. Daha da iyisi, yem stdin /dev/null.
Plazma Güç

@PlasmaPower burada + 1'iniz var. İyi günler :)
boris quiroz
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.