Przetwarzaj Java, która wciąż jest zabijana


11

Muszę uruchomić program Java na serwerach uniwersyteckich. Zdalnie loguję się przez ich serwery za pośrednictwem ssh

Więc użyłem nohup tak:

nohup java -jar project.jar &

Jednak gdy wylogowuję się i zamykam terminal, a następnie loguję się z powrotem na serwer, proces nie działa / został zabity.


Spróbuj przekierować stdouti stderrdo niektórych plików - twój proces może zostać zabity przez sygnał inny niż SIGHUP, gdy próbujesz zapisać na zamkniętym terminalu stdout/ stderr. Np. Dodaj >/dev/null 2>&1do swojego polecenia przed &znakiem zadania.
Boris Burkov

1
@Bob nie powinien być konieczny nohup- większość implementacji zrobi to domyślnie, chociaż może być konieczne przekierowanie stdinnp </dev/null.
Graeme

Odpowiedzi:


14

nohuptylko sprawiają, że program jest odporny SIGHUPi SIGQUITsygnalizuje. Nowoczesna powłoka może wysyłać inne sygnały po wylogowaniu się z sesji, więc nie ma gwarancji, że twój program nie zostanie zabity, nawet uruchomiony nohup.

Lepszym rozwiązaniem jest użycie tmuxlub screen, lub jeśli używasz bash, możesz spróbować:

$ java -jar project.jar &
$ disown

Jeśli używasz disown, musisz przekierować ręcznie, np. Dodaj</dev/null &>/dev/null
Graeme

@Graeme: Myślę, że jeśli nie będziemy już pracować z powłoką (wystarczy uruchomić polecenie i wyjść), przekierowanie nie jest konieczne.
cuonglm

Spróbować ssh localhost 'sleep 10m & disown'. bashnie wyjdzie.
Graeme

Ok, wydaje się, sshże nie można wyjść, jeśli do terminalu podłączone są programy. Jednak powyższe jest w porządku, jeśli działasz interaktywnie.
Graeme

Implementacje Linux (GNU coreutils i busybox) i BSD nohupnie czynią polecenia odpornym SIGQUIT, ale tylko na SIGHUP. Byłoby to wyraźnie sprzeczne ze standardem, a AFAIK może się zdarzyć tylko w (niektórych wersjach?) Solaris.
mosvy

13

Jeszcze inna opcja zamiast (chronicznie dysfunkcjonalna) nohup:

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

To skutecznie „demonizuje” proces. Jest teraz własnością init, więc nigdy nie dostanie HUP, jego strumienie I / O są bezpieczne, i został rozwidlony w tle.

Zobacz man setsidpo więcej informacji. W przeciwieństwie do screenlub tmux, nie jest to program, który rości sobie prawo własności i nadal działa. Po prostu uruchamia program we własnej grupie procesów .


Dlaczego nohup jest dysfunkcyjny?
cpugeniusmv

@cpugeniusmv Jestem pewien, że jest do czegoś przydatny, jednak nie uważam go za niezawodny w celu, do którego jest często zalecany, logując się gdzieś, rozpoczynając proces i wylogowując się (podobnie jak OP). Wydaje mi się, że mogło to być niewłaściwe użycie i być może setsidjest to trochę więcej idiotycznych dowodów w ten sposób. Pomija krok sugerowany przez nohup (proces ponownego rodzicielstwa przez init jako sierota). nohupbyłaby bardziej elastyczna, jeśli potencjalnie chcesz później wysunąć zadanie na pierwszy plan.
złotowłosa

@ TAFKA'goldilocks 'Myślę, że problem polega na obsłudze stdin, stdout i stderr, co nie jest tak naprawdę (ale częściowo (!)) Obsługiwane przez nohup. Nohup wykonuje swoją główną robotę całkiem dobrze, chroniąc proces przed SIGHUP. Ale jest wiele rzeczy, które mogą pójść nie tak ze strumieniami - lub, co gorsza, czasami się nie udają, w zależności od wielkości buforów. Powiedziałbym, że nie ma nic złego, ale oczekiwanie, że nic nie zrobi.
Volker Siegel


-2

Spróbuj uruchomić nohup z STDOUT i przekierowaniem STDERR na null:

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

1
Przekierowujesz tylko stderr na stdout, co nie zmienia niczego w tym, jak działa nohup (przekierowuje oba na nohup.out).
Gilles 'SO - przestań być zły'

1
-1, myślę, że miałeś na myśli, nohup java -jar project.jar 2>/dev/null &ale oczywiście nie wiesz, co robisz. Jeszcze lepiej, również karmić stdin /dev/null.
PlazmaPower

@PlasmaPower tutaj masz +1. Miłego dnia :)
Boris Quiroz
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.